OpenCV с потоками и мьютексами

0

Я написал довольно базовую программу 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; 
}

Я был бы рад, если бы вы помогли мне решить эту проблему. Спасибо, Матан

Теги:
opencv
multithreading
mutex
pthreads

1 ответ

3
Лучший ответ

Я смог решить это, используя следующий код:

#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 frame\n");
            continue;

        }


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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню