【问题标题】:OpenCV - Capture frames in a separatethreadOpenCV - 在单独的线程中捕获帧
【发布时间】: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 &amp; cap)。 (恕我直言,您不能复制 VideoCapture )
  • 我尝试通过引用传递相机。然而,它没有帮助。我还在我的线程中检查了 cap.isOpened() 并且它成功返回。不确定,为什么 cap>>frame 不起作用。
  • @pree 你解决过这个问题吗?

标签: c++ opencv android-ndk android-camera


【解决方案1】:

据我所知线程不能返回结果,所以你需要通过引用传递 cap 或者如果你使用future会更好,使用future和线程可以帮助你从函数返回结果。 不要使用线程,而是使用更适合线程的异步。

【讨论】:

  • 你能举例说明代码应该是什么样子吗?
【解决方案2】:

您可以尝试以下方法吗:

#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::VideoCapture 对象。它应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2014-06-03
    • 2012-05-21
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多