带有 pthreads 和互斥体的 OpenCV

OpenCV with pthreads and mutexes

本文关键字:OpenCV pthreads 带有      更新时间:2023-10-16

我编写了一个相当基本的C++程序,该程序使用OpenCV库来显示我拥有的IP摄像机的视频流。

由于我想在将来添加图像处理代码,我认为使用线程来执行此操作是个好主意。一个线程捕获最新的帧,另一个线程读取此帧并将其显示在屏幕上。我使用了一个pthread_mutex_t来锁定帧变量。

我的问题是代码实际上是编译的,但是当我执行程序时没有任何反应,它只是在几秒钟后存在。我已经验证这不是VideoCapture对象的问题,但我不知道为什么这不起作用。

这是我的代码:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <pthread.h>
using namespace cv;
using namespace std;
//GLOBALS
VideoCapture vcap;
Mat frame;
pthread_mutex_t *frameLocker;
const string videoStreamAddress = "http://10.0.0.6/mjpg/video.mjpg";
void *Proc(void *arg)
{
    for(;;)
    {
        pthread_mutex_lock(frameLocker);
        vcap.read(frame);   
        pthread_mutex_unlock(frameLocker);
    }
}
int main(int, char**) { 
    frameLocker = new pthread_mutex_t();
    vcap.open(videoStreamAddress);
    pthread_mutex_init(frameLocker,NULL);   
    pthread_t *ProcThread;  
    pthread_create(ProcThread, NULL, Proc, NULL);

    for(;;)
    {               
        pthread_mutex_lock(frameLocker);
        imshow("Output Window", frame);         
        pthread_mutex_unlock(frameLocker);
    }
    delete frameLocker; 
}

如果您能帮助我解决这个问题,我会很高兴。谢谢马坦

我能够使用以下代码解决此问题:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <pthread.h>
using namespace cv;
using namespace std;
//GLOBALS
VideoCapture vcap;
Mat frame;
pthread_mutex_t frameLocker;
const string videoStreamAddress = "http://IP/mjpg/video.mjpg";
void *UpdateFrame(void *arg)
{
    for(;;)
    {
        Mat tempFrame;
        vcap >> tempFrame;
        pthread_mutex_lock(&frameLocker);
        frame = tempFrame;
        pthread_mutex_unlock(&frameLocker);
    }
}
int main(int, char**) { 
    vcap.open(videoStreamAddress);
    pthread_mutex_init(&frameLocker,NULL);  
    pthread_t UpdThread;    
    pthread_create(&UpdThread, NULL, UpdateFrame, NULL);

    for(;;)
    {
        Mat currentFrame;
        pthread_mutex_lock(&frameLocker);
        currentFrame = frame;
        pthread_mutex_unlock(&frameLocker);
        if(currentFrame.empty()){
            printf("recieved empty framen");
            continue;
        }

        imshow("Output Window", currentFrame);
        waitKey(1);
    }
}