2016-06-22 5 views
0

Fehler Ich habe eine Anwendung A JavaCameraView von OpenCV für Android verwenden, die die folgenden Callback-OpenCV die Größe

CameraBridgeViewBase.CvCameraViewListener cvListener = new CameraBridgeViewBase.CvCameraViewListener() { 
    @Override 
    public void onCameraViewStarted(int width, int height) { 

    } 

    @Override 
    public void onCameraViewStopped() { 

    } 

    @Override 
    public Mat onCameraFrame(Mat inputFrame) { 
     Size newSize = new Size(400, 200); 
     Mat fit = new Mat(newSize, CvType.CV_8UC4); 
     Imgproc.resize(inputFrame,fit,newSize); 
     return fit; 
    } 
}; 

jedoch verwendet, wenn die Redimensionierung der Fall ist, tritt ein Fehler zu sagen

E/CameraBridge: Utils.matToBitmap() throws an exception: /Volumes/Linux/builds/master_pack-android/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) 
E/cv::error(): 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 /Volumes/Linux/builds/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp, line 97 
E/org.opencv.android.Utils: nMatToBitmap catched cv::Exception: /Volumes/Linux/builds/master_pack-android/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) 
E/CameraBridge: Mat type: Mat [ 244*432*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0x1ade1b0, dataAddr=0x5dbc6010 ] 
E/CameraBridge: Bitmap type: 240*160 

Nichts geschieht in die tatsächliche Benutzeroberfläche. Ich bin mir nicht sicher, warum ich diesen Fehler sehe, da ich niemals Utils.bitmapToMat oder Utils.matToBitmap anrufe. Wenn ich die Imgproc.resize(inputFrame,fit,newSize); herausnehmen und die inputFrame zurückschicke, funktioniert alles wie erwartet.

Antwort

2

Für onCameraFrame, glaube ich, dass Sie die Matte der gleichen Größe wie Ihre inputFrame zurückgeben müssen. Da die Auflösung des von der Kamera erhaltene Bildes ist 240 * 160 (siehe this->E/CameraBridge: Bitmap type: 240*160) müssen Sie Ihre Matte der Größe 160 bis 240 * fit zurück, nachdem Sie Ihre Verarbeitung getan ..

Eine einfache Lösung:

@Override 
public Mat onCameraFrame(Mat inputFrame) { 
    Size newSize = new Size(400, 200); 
    Mat fit = new Mat(newSize, CvType.CV_8UC4); 
    Imgproc.resize(inputFrame,fit,newSize); 

    /**Your processing code */ 

    Imgproc.resize(fit,fit,inputFrame.size()); <- Add this line 

    return fit; 
} 

um die Größe des Bildes ändern Sie von der Kamera empfangen, müssen Sie mOpenCvCameraView.setMaxFrameSize(width, height); nennen, aber die Auflösung wird aus der Liste der Auflösungen von der Kamera-Hardware unterstützt gewählt werden. Um mehr darüber zu erfahren, warum Sie keinen willkürlichen Wert für die Auflösung festlegen können, müssen Sie auf Android Camera API lesen, da OpenCV verwendet, um die Bilder auf der Rückseite zu greifen :)