Autore Topic: Android Camera preview non si adatta alla size del FrameLayout contenitore  (Letto 668 volte)

Offline sams4

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 8
Buongiorno a tutti.
Ho da poco cominciato ad avere a che fare con l'ambiente di sviluppo Android. Uso Eclipse Juno, con l'ausilio di Opencv4Android (nella versione 2.4.5), per sfruttare le funzionalità delle librerie opencv. Ho importato tutti i relativi tutorials su Eclipse, e ho deciso di utilizzare l'esempio "cameracontrol" come base per l'applicazione che voglio sviluppare.
Il mio problema è il seguente: ho organizzato il layout della mia applicazione affinchè vi sia un FrameLayout di dimensioni prefissate che dovrebbe contenere la preview della mia camera. Tuttavia il FrameLayout non contiene perfettamente tale preview, in quanto vi sono bordi neri derivanti probabilmente dal fatto che le dimensioni della preview non coincidono perfettamente con quelle del FrameLayout, e non c'è nessun riadattamento.

Nel tutorial "cameracontrol", nella classe Tutorial3View, vi è un metodo che consente il settaggio manuale della risoluzione della preview della camera, che potrebbe rendermi possibile riadattare le dimensioni della preview a quelle del mio FrameLayout, ma se la uso all'interno del metodo onCreate() della main activity, l'app crasha.
Il metodo in questione è:

   
Codice (Java): [Seleziona]
public void setResolution(Size resolution) {
        disconnectCamera();
        mMaxHeight = resolution.height;
        mMaxWidth = resolution.width;
        connectCamera(getWidth(), getHeight());
    }

.

Oltretutto, preferirei riadattare "dinamicamente" la dimensione del mio FrameLayout a quella della mia preview, per non avere distorsioni nella qualità della immagine. Ma questo significherebbe fissare una risoluzione della camera, e riadattare su ogni dispositivo su cui l'app dovesse girare il mio FrameLayout alle dimensioni della preview.

Ho tentato anche, nella OnCreate(), di ottenere width and height del FrameLayout, così da passarli come oggetto Size alla setResolution, ma la mia app crasha ugualmente.
Questo è il codice xml del mio FrameLayout (dove MyView è il mio nome della classe equivalente a Tutorial3View):

   
Codice (XML): [Seleziona]
<FrameLayout
       android:id="@+id/frame_capture"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:visibility="visible"
       android:clickable="false" android:foregroundGravity="fill"      android:layout_weight="0.7"
       android:layout_gravity="top">
        <com.micaela.myapp.MyView
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:id="@+id/HelloOpenCvView"
                        android:visibility="gone"
                        opencv:show_fps="true"
                    />
        <ImageButton
               android:layout_width="51dp"
               android:layout_height="43dp"
               android:id="@+id/imageButton"
               android:layout_gravity="bottom|left"
               android:src="@drawable/switch_cam"
               android:background="#FF000000" android:cropToPadding="false" android:scaleType="centerCrop"/>
     </FrameLayout>

Il progetto tutorial utilizzato è rintracciabile a questo link:  https://github.com/Itseez/opencv/tree/master/samples/android/tutorial-3-cameracontrol

e viene usata la classe org.opencv.android.JavaCameraView per aprire la camera del dispositivo.
Come potrei fare?
Ogni tipo di aiuto sarebbe davvero molto apprezzato.

Ho anche pensato di adattare al volo al FrameLayout la dimensione di ogni frame, quando viene catturato. Così nel metodo onCameraFrame, chiamo questa funzione da me creata:

   
Codice (Java): [Seleziona]
 public void manageSize(Mat matrix){
        size = new org.opencv.core.Size(frameLayout.getMeasuredWidth(),frameLayout.getMeasuredHeight());
        Log.i(TAG,"ciao "+frameLayout.getMeasuredHeight());
        Log.i(TAG,"ciao "+frameLayout.getMeasuredWidth());
        Log.i(TAG,"prova "+size);
        Imgproc.resize(matrix,matrix,size);
    }

passando il frame e dove il FrameLayout è il contenitore della preview. Ho verificato che width and height del frame arrivano correttamente.
Ma in questo caso ottengo nel logcat questo errore:

   
Codice: [Seleziona]
05-31 11:34:47.548: ERROR/cv::error()(17253): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 97
    05-31 11:34:47.548: ERROR/org.opencv.android.Utils(17253): nMatToBitmap catched cv::Exception: /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
    05-31 11:34:47.548: ERROR/CameraBridge(17253): Mat type: Mat [ 1013*1050*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0x70b0c4b0, dataAddr=0x74f6d010 ]
    05-31 11:34:47.548: ERROR/CameraBridge(17253): Bitmap type: 960*720
    05-31 11:34:47.548: ERROR/CameraBridge(17253): Utils.matToBitmap() throws an exception: /home/reports/ci/slave/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)

In allegato un'immagine esempio del mio problema.

Post unito: 03 Giugno 2013, 17:32:24 CEST
Problema risolto settando manualmente, nella classe CameraViewBridgeBase, estesa dalla JavaCameraView da me utilizzata, il valore di mScale, un fattore di scala che se aumentato, elimina il problema dei bordi neri nella preview, che, come compromesso, fa sembrare un po' zoomata la preview della camera.
« Ultima modifica: 03 Giugno 2013, 17:32:24 CEST da sams4, Reason: Merged DoublePost »