Я написал довольно базовую программу 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 frame\n");
continue;
}
imshow("Output Window", currentFrame);
waitKey(1);
}
}