无法使用OpenCV4Android的两台Evo 4G相机

时间:2013-04-11 21:53:59

标签: android opencv stereo-3d htc-android

我计划通过从Evo 3D的两个后置摄像头拍摄两张照片来计算视差图。但是,我只能使用一台相机。我尝试了不同的索引。

索引

  • 0给我左相机(其中一个后置相机)
  • 1给了我前置摄像头
  • -1给我左相机(其中一个后置相机)。

我曾经使用-1索引获得其他相机,但它已不再使用了。我正在使用CameraBridgeViewBase

我在谷歌的android-opencv小组上看到人们已经成功使用了Evo 3D手机的两款相机。我想知道该怎么做?还有其他指数吗?还是有其他方法可以使用它。

P.S。原生相机不起作用。 (Android 4.0.3)。

2 个答案:

答案 0 :(得分:2)

随着ICS升级,Android中的立体摄像机ID从2变为100。这是Android Camera.open调用使用的常量。我认为没有任何官方方式来获得一台相机或另一台相机。您只能获得一张图像或两张图像。

答案 1 :(得分:2)

正如上面的答案所示,我使用100作为相机索引,但它不适用于OpenCV,所以我尝试使用Android的Camera SDK,但出现了一些错误。但由于这是HTC Open Sense SDK的一部分,我在Eclipse上下载并使用了http://www.htcdev.com/devcenter/opensense-sdk/stereoscopic-3d/s3d-sample-code/。我使用了S3D Camera Demo的基本文件,并添加了更多功能,以便我可以访问Camera图像数据并将其转换为OpenCV Mat。

所以我在该代码中对onTouchEvent函数进行了一些更改,并在那里添加了更多代码。

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    //  toggle();
        //Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
        //startActivityForResult(cameraIntent, 1337);
        int bufferSize = width * height * 3;
        byte[] mPreviewBuffer = null;

        // New preview buffer.
        mPreviewBuffer = new byte[bufferSize + 4096];

        // with buffer requires addbuffer.
        camera.addCallbackBuffer(mPreviewBuffer);
        camera.setPreviewCallbackWithBuffer(mCameraCallback);
        break;
    default:
        break;
    }
    return true;
}



private final Camera.PreviewCallback mCameraCallback = new Camera.PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera c) {
    Log.d(TAG, "ON Preview frame");
    img = new Mat(height, width, CvType.CV_8UC1);
    gray = new Mat(height, width, CvType.CV_8UC1);
    img.put(0, 0, data);        



    Imgproc.cvtColor(img, gray, Imgproc.COLOR_YUV420sp2GRAY);
    String pixvalue = String.valueOf(gray.get(300, 400)[0]);
    String pixval1 = String.valueOf(gray.get(300, 400+width/2)[0]);
    Log.d(TAG, pixvalue);
    Log.d(TAG, pixval1);
        // to do the camera image split processing using "data"
}
};

您从相机获得的图像处于YUV420s模式,我最初在访问数据时遇到了问题,因为我创建了一个4通道垫。实际上,它只需要1个通道Mat。