【发布时间】:2014-04-02 19:05:19
【问题描述】:
我正在尝试使用 OpenCV 2.4.8 在我的 android 应用程序中捕获帧。我为它编写了一个 .SO 库并将 OpenCV 库链接到它。
从这个链接:http://docs.opencv.org/modules/core/doc/intro.html,我写了一个示例代码如下。
int main() {
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
capture(cap);
}
void capture(VideoCapture cap) {
for(int i = 0; i<= 3; i++)
{
cap >> frame;
}
}
只要我从主线程运行此代码,它就可以正常工作。如果我尝试在单独的线程中运行它,例如
std::thread t(capture, cap);
它无法捕获帧。它在代码行给了我一些致命错误
cap>> frame;
在上面的代码中。但是,在上面的OpenCV文档中,明确的说“当前的OpenCV实现是完全可重入的。也就是说,同一个函数,同一个类实例的同一个常量方法,或者不同类实例的同一个非常量方法都可以被不同的线程调用。另外,相同的 cv::Mat 可以在不同的线程中使用,因为引用计数操作使用特定于体系结构的原子指令。"
知道我在这里缺少什么吗?
编辑:
我尝试在线程中打开相机并修改 capture() 如下:
void capture() {
VideoCapture cap(0); // fails here
if(!cap.isOpened()) return -1;
for(int i=0; i <= 3; i++) {
cap >> frame;
}
}
打开相机本身失败,这很奇怪。有什么建议吗?
【问题讨论】:
-
试试:
void capture(VideoCapture & cap)。 (恕我直言,您不能复制 VideoCapture ) -
我尝试通过引用传递相机。然而,它没有帮助。我还在我的线程中检查了 cap.isOpened() 并且它成功返回。不确定,为什么 cap>>frame 不起作用。
-
@pree 你解决过这个问题吗?
标签: c++ opencv android-ndk android-camera