从线程获取相机图像

Posted

技术标签:

【中文标题】从线程获取相机图像【英文标题】: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 中创建它并将其传递给线程并使用该线程来捕获帧。 【参考方案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问题还是其他问题。

以上是关于从线程获取相机图像的主要内容,如果未能解决你的问题,请参考以下文章

使用线程获取图像资源时,意图选择器保持打开状态

如何使用 zed mini 相机同时获取 60 fps 的图像和 500 hz 的 imu 数据?

从相机胶卷中获取所有图像并将其显示在滚动视图上?

从相机获取 yuv 平面格式图像 - iOS

从 iPhone 相机胶卷中获取图像

使用 PHPhotoLibrary 从相机胶卷中获取相机点击的照片