2017-02-09 5 views
-2

La qualité d'image de mon résultat de caméra personnalisée est médiocre par rapport à la caméra système à l'aide de l'api camera2.Pourquoi la qualité d'image personnalisée de la caméra n'est-elle pas aussi élevée que celle de la caméra système?

Mon application est basée sur l'exemple Camera2Basic. et tous les modes sont réglés sur auto et en utilisant la plus grande taille disponible.

Résultats JPEG:

Caméra personnalisée: 3984x2988, 630KB

caméra natif: 3984x2988, 2.73MB

Tous les exemples open source ont presque la même sortie. Y a-t-il un moyen d'obtenir de meilleurs résultats? Toute aide serait appréciée!

+0

Avez-vous essayé de régler le débit à la même valeur que celle que vous trouvez dans les vidéos prises avec l'application de caméra native? –

+0

@LouisCAD Non, parce que je prends des photos seulement – imudin07

+0

Quel modèle avez-vous utilisé pour votre demande de capture? –

Répondre

0

J'ai trouvé une autre solution. C'est le meilleur. J'utilise simplement samsung camera sdk. Il est très impressionnant, et les résultats sont bien meilleurs que l'appareil photo personnalisé, presque même que l'application caméra native.

0

Veuillez jeter un coup d'œil à CameraView. Ceci est une mise en œuvre de caméra personnalisée, je pense que cela vous donnera un bon endroit pour commencer.

+0

J'ai testé leur démo et le résultat ne correspond pas à ce que j'attendais :( – imudin07

+0

Qu'avez-vous trouvé ne fonctionnant pas spécifiquement? – raktale

+0

Cela fonctionne, mais ma question est pourquoi la qualité de l'image n'est pas aussi élevée que la qualité de la caméra native – imudin07

0

Voici l'application pour utiliser la pleine résolution de votre appareil photo:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest package="com.osahub.rachit.highrescamera" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".CameraActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
</application> 

CameraActivity.java

package com.osahub.rachit.highrescamera; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.Matrix; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v4.view.MenuItemCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.ShareActionProvider; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 

import java.io.File; 

public class CameraActivity extends AppCompatActivity { 

    ImageView image; 
    Button camera; 
    Uri imageUri; 
    private String folderPath = Environment.getExternalStorageDirectory() 
     .getPath() + "/CameraActivity/images"; 
    private File file; 

    private ShareActionProvider mShareActionProvider; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 
     camera = (Button) findViewById(R.id.camera); 
     image = (ImageView) findViewById(R.id.image); 
     File folder = new File(folderPath); 
     folder.mkdirs(); 

     file = new File(folder.getPath() + "/image.jpg"); 
     camera.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       imageUri = Uri.fromFile(file); 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
       startActivityForResult(intent, 10); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     try { 
      Bitmap bp = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); 
      Matrix rotateMatrix = new Matrix(); 
      rotateMatrix.postRotate(90); 
      Bitmap rotatedBitmap = Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), 
       bp.getHeight(), rotateMatrix, false); 
      camera.setVisibility(View.GONE); 
      image.setImageBitmap(rotatedBitmap); 
      setShareIntent(createShareIntent()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_camera, menu); 

     MenuItem item = menu.findItem(R.id.action_share); 
     mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); 

     setShareIntent(createShareIntent()); 
     return true; 
    } 

    private void setShareIntent(Intent shareIntent) { 
     if (mShareActionProvider != null) { 
      mShareActionProvider.setShareIntent(shareIntent); 
     } 
    } 

    private Intent createShareIntent() { 
     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); 
     shareIntent.setType("image/*"); 
     return shareIntent; 
    } 
} 

activity_camera.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin" 
       tools:context=".CameraActivity"> 

    <Button 
     android:id="@+id/camera" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="@string/open_camera"/> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignTop="@+id/camera" 
     android:contentDescription="@string/image_description"/> 
</RelativeLayout> 
+0

je vous remercie pour vos efforts, mais j'utilise caméra personnalisée – imudin07

0

Il y a cette grande application de la caméra ouverte. Il est open source et vous pouvez vérifier comment il a fait l'économie d'image. Je pense que votre problème est l'économie d'image. Votre image est si petite que l'original et c'est pourquoi votre image est de mauvaise qualité. Voici le site Web de la caméra vidéo http://opencamera.sourceforge.net/. Caméra de support caméra ouverte api 1 et api 2.

+0

J'ai testé cette application avant, c'est même que camera2basic – imudin07

+0

Si vous capturez l'image par caméra ouverte avec une résolution complète. Est-ce que cette taille est inférieure à 1 Mo? – Maxitors

+0

Oui Il est 541KB en utilisant samsung s6 – imudin07

0

Après quelques recherches, j'ai trouvé une solution. Ce code github m'a beaucoup aidé: https://github.com/webjb/myrobot

Je prends l'image de la caméra avec YUV_420_888 le format et passer son tampon d'octets à l'aide OpenCV NDK et OpenCV enregistre en tant que jpeg.

La qualité est élevée et la taille du fichier est supérieure à 2 Mo!