C++ OpenCV-在单独的读取中捕获帧

C++ OpenCV-在单独的读取中捕获帧,c++,opencv,android-ndk,android-camera,C++,Opencv,Android Ndk,Android Camera,我正在尝试使用OpenCV 2.4.8在我的android应用程序中捕获帧。我为它编写了一个.SO库,并将OpenCV库链接到它 从这个链接:,我编写了一个示例代码,如下所示 int main() { VideoCapture cap(0); if(!cap.isOpened()) return -1; capture(cap); } void capture(VideoCapture cap) { for(int i = 0; i<= 3; i++) { c

我正在尝试使用OpenCV 2.4.8在我的android应用程序中捕获帧。我为它编写了一个.SO库,并将OpenCV库链接到它

从这个链接:,我编写了一个示例代码,如下所示

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;
  }
}
它无法捕获帧。它在代码行中给了我一些致命的错误

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捕获(){
VideoCapture cap(0);//此处失败
如果(!cap.isOpened())返回-1;
对于(int i=0;i>frame;
}
}

它在打开相机时失败,这很奇怪。有什么建议吗?

据我所知,线程无法返回结果,因此您需要通过引用传递cap,或者使用future更好,使用future with threads可以帮助您从函数返回结果。
不要使用线程,而是使用异步,异步更适合线程。

您可以尝试以下方法吗:

#include <iostream>
#include <thread>
using namespace cv;

void capture(VideoCapture &cap) 
{
  Mat frame;
  for(int i = 0; i<= 3; i++)
  {
    cap >> frame;
    // do something with frame e.g. imshow("image", frame);
  }
}

int main(int argc, char *argv[]) 
{
  VideoCapture cap(0);
  if(!cap.isOpened()) return -1;
  std::thread t(capture, std::ref(cap));
  // in the meantime do something else here
  t.join();  // wait for the thread to be finalized
  return 0;
}
#包括
#包括
使用名称空间cv;
无效捕获(视频捕获和cap)
{
垫架;
对于(int i=0;i>frame;
//用框架做些事情,例如imshow(“图像”,框架);
}
}
int main(int argc,char*argv[])
{
视频捕获上限(0);
如果(!cap.isOpened())返回-1;
标准::螺纹t(捕获,标准::参考(cap));
//同时,在这里做些别的事情
t、 join();//等待线程完成
返回0;
}

这里我通过引用传递
cv::VideoCapture
对象。它应该可以解决您的问题。

尝试:
void capture(VideoCapture&cap)
(如果您不能复制视频捕获),我尝试通过引用传递相机。但是,它没有帮助。我还检查了cap.isOpened()也在我的线程中,它成功返回。不确定,为什么cap>>框架不起作用。@pree你曾经解决过这个问题吗?你能举个例子说明代码应该是什么样子吗?
#include <iostream>
#include <thread>
using namespace cv;

void capture(VideoCapture &cap) 
{
  Mat frame;
  for(int i = 0; i<= 3; i++)
  {
    cap >> frame;
    // do something with frame e.g. imshow("image", frame);
  }
}

int main(int argc, char *argv[]) 
{
  VideoCapture cap(0);
  if(!cap.isOpened()) return -1;
  std::thread t(capture, std::ref(cap));
  // in the meantime do something else here
  t.join();  // wait for the thread to be finalized
  return 0;
}