【问题标题】:Getting camera image from thread从线程获取相机图像
【发布时间】:2014-09-29 22:06:53
【问题描述】:

我正在使用 opencv 库从内置网络摄像头获取视频。当我将相机逻辑代码放入主函数时,以下代码运行良好,但当我将其放入单独的线程时却不行。 task1() 线程在 cv::VideoCapture capture(0) 处停止。同时task2() 和主线程都在正确执行。

有人能解释一下为什么 opencv 逻辑在放入单独的线程时不起作用吗?

我的代码:

#include <iostream>
#include <string.h>
#include <thread>
#include <unistd.h>
#include <opencv2/opencv.hpp>

using namespace std;

void task1 (){
            cout<<"1st thread ";
            cv::Mat frame;
            cv::VideoCapture capture(0);
            if ( capture.isOpened() == false )
            {
                cout<<"Failed to open camera";
            }

            cv::namedWindow("Test OpenCV",1);


            while ( true ){
                capture >> frame;
                cv::imshow("Test OpenCV", frame );
                int key = cv::waitKey(1);
                if ( key == 27 )
                    break;
            }

        }

        void task2 (){
            int n = 0;
            while (1){
                cout<<"2nd thread "<<n<<"\n";
                sleep(3);
                n++;
            }
        }

        int main(int argc, const char * argv[]) {
            // insert code here...
            cout << "Hello, World!\n";
            thread t1(task1);
            thread t2(task2);
            //t1.join();
            //t2.join();
            int n = 0;
            while (1){
                cout<<"main thread "<<n<<"\n";
                sleep(1);
                n++;
            }  
            return 0;
        }

【问题讨论】:

  • 看起来那个线程根本没有机会运行。
  • 几年前我在使用 Qt 和 OpenCV 时遇到过同样的问题。我不确定,但我认为我采用了 C 方法:CvCapture* cvCaptureFromCAM(int device) 并且有效。
  • @Ashalynd 它肯定会运行。我用断点和 cout 仔细检查了它
  • 您是否尝试过将cap 声明为全局对象?
  • 你什么时候执行线程? main 中的循环是无限的无所事事。我还建议您不要使用线程来创建捕获对象。您应该在 main 中创建它并将其传递给线程并使用该线程来捕获帧。

标签: c++ multithreading opencv


【解决方案1】:

您的代码运行正常(无需任何修改),并且我通过 task1 线程(使用 OpenCV 2.4.5)获得实时提​​要。 我为编译器支持添加了-std=gnu++0x 标志(否则 g++ 会抛出错误)。

g++ -std=gnu++0x opencv_thread.cpp -o opencv_thread `pkg-config --cflags --libs opencv`

检查我的控制台输出here。我在 task1 的 while 循环中添加了一个cout &lt;&lt; "1st thread "&lt;&lt; endl;

我认为这个问题可能特定于某些 opencv 版本,因为我在旧版本(不记得是哪一个)和 boost 线程中看到了类似的问题。 你能详细说明你使用的版本吗?也可以用 2.4.5 试试。

【讨论】:

  • 我使用 linux 并且没有 osx :(。但是我的同事建议我不要使用 2.4.9,因为它有类似的问题(我会在尝试后确认是否是 linux 的情况) out). 你可以试试 2.4.5 吗?
  • 我已经通过重组项目解决了这个问题 -> 我将 opencv 逻辑放在主线程中,其余的放在辅助线程中:) 无论如何,我会在几天内尝试 2.4.5检查是opencv问题还是其他问题。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多