OpenCV 2.3:如何从Android摄像头捕获帧?

时间:2011-08-26 00:47:53

标签: android opencv android-ndk

我正在尝试在Android上使用新的OpenCV功能:本机摄像头访问。根据{{​​3}}文档,它很容易,但我只是得到错误而没有成功。

有DDMS日志:

  

08-26 03:28:56.825:DEBUG / CAMERA_ACTIVITY(12613):库名:libopencv_java.so   08-26 03:28:56.825:DEBUG / CAMERA_ACTIVITY(12613):库基地址:0x81800000   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):找到的库文件夹:/data/data/com.viactivity.ar/lib/   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):CameraWrapperConnector :: connectToLib:folderPath = / data / data / com.viactivity.ar / lib /   08-26 03:28:56.835:ERROR / CAMERA_ACTIVITY(12613):|| libnative_camera_r2.2.2.so   08-26 03:28:56.835:ERROR / CAMERA_ACTIVITY(12613):|| libnative_camera_r2.3.3.so   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):尝试加载库'libnative_camera_r2.2.2.so'   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):CameraWrapperConnector :: connectToLib ERROR:无法dlopen相机包装库/data/data/com.viactivity.ar/lib/libnative_camera_r2.2.2.so,dlerror =“不能load library:find_library [1223]:11258'libnative_camera_r2.2.2.so'以前加载失败“   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):尝试加载库'libnative_camera_r2.3.3.so'   08-26 03:28:56.835:DEBUG / CAMERA_ACTIVITY(12613):CameraWrapperConnector :: connectToLib错误:无法dlopen相机包装库/data/data/com.viactivity.ar/lib/libnative_camera_r2.3.3.so,dlerror =“不能load library:find_library [1223]:11258'libnative_camera_r2.3.3.so'先前无法加载“   08-26 03:28:56.835:ERROR / CAMERA_ACTIVITY(12613):CameraWrapperConnector :: connectToLib错误:无法打开相机包装库   08-26 03:28:56.835:ERROR / CV_CAP(12613):Native_camera返回打开错误:4   08-26 03:28:56.835:ERROR / AR_code(12613):捕获错误!

代码有两种变体:

CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANDROID + 0 ); 
IplImage* frame = cvQueryFrame( capture );
cvReleaseCapture(&capture);

cv::VideoCapture capture(CV_CAP_ANDROID + 0);
cv::Mat frame;

capture >> frame;

它们都会产生相同的错误。 有人能够在Android上获得原生相机访问权限吗? 非常感谢!

UPD: 上面的故事是关于Android 3.2。根据Andrey Kamaev的说法,不支持Android 3.2。 我尝试在HTC Wildfire上测试相同的代码,但又出现了另一个错误:

  

08-26 19:49:06.856:DEBUG / OpenCV_NativeCamera(1337):   CameraHandler :: initCameraConnect(0x813e65a1,0,0x285a20,0x0)08-26   19:49:06.856:DEBUG / CameraService(72):CameraService :: connect E(pid   1337,客户端0x693d8)08-26 19:49:06.856:DEBUG / CameraService(72):   CameraService :: connect X(pid 1337,新客户端0x693d8)被拒绝。 (旧   pid 1337,老客户端0x18728)08-26 19:49:06.856:   ERROR / OpenCV_NativeCamera(1337):initCameraConnect:无法连接   到CameraService 08-26 19:49:06.856:ERROR / CAMERA_ACTIVITY(1337):   CameraWrapperConnector :: connectWrapper错误:初始化   函数返回false 08-26 19:49:06.856:ERROR / CV_CAP(1337):   Native_camera返回了打开错误:6

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

目前,OpenCV原生相机不支持Android 3.2(因为它的来源不公开。)

只要与Android 3.2兼容的版本可用,我就会发布更新。

更新

OpenCV trunk已经有Android 3.x和4.0.x的解决方案。它将被包含在OpenCV的下一个主要版本中。

答案 1 :(得分:1)

你所描述的上述两种方法无法解决,而不是......

使用Camera.Preview回调获取原始YUV帧,然后将YUV帧转换为RGB,然后根据可用数据构建IPlImage *,

然后使用构造的IplImage进行进一步处理