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