Opencv分段错误使用pthread捕获帧C++



我在尝试运行程序时收到分段错误。我只是在修改我的程序以在不同的线程上捕获来自两个相机的帧之后才收到分割错误。我在两个线程上都使用了相同的函数,我想知道这是否是问题所在。

Main.c

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <opencv2/opencv.hpp>
#include "ThreadedWebcamCapture.h"
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int main(){
ThreadedCapture Capture1;
Capture1.STOP = 0;
Capture1.CAP_NUMBER = 1;
Capture1.X_RESOLUTION = 640;
Capture1.Y_RESOLUTION = 480;
ThreadedCapture Capture2;
Capture2.STOP = 0;
Capture2.CAP_NUMBER = 0;
Capture2.X_RESOLUTION = 640;
Capture2.Y_RESOLUTION = 480;
pthread_t Capture1Thread;
int Capture1ThreadRetCode;
pthread_t Capture2Thread;
int Capture2ThreadRetCode;
printf("[INFO]Creating Threadsn");
Capture1ThreadRetCode = pthread_create(&Capture1Thread, NULL, &Capture_Thread, (void *)&Capture1);
printf("[INFO]Created Thread 1");
Capture2ThreadRetCode = pthread_create(&Capture2Thread, NULL, &Capture_Thread, (void *)&Capture2); //I think the error is occurring here
if(Capture1ThreadRetCode || Capture2ThreadRetCode != 0){
printf("[ERROR]Thread Creation Failed!n");
exit(EXIT_FAILURE);
}
//cv::namedWindow("Window", cv::WINDOW_AUTOSIZE);
int NumberOfFrames;
time_t Seconds1;
Seconds1 = time(NULL);
cv::Mat Output;
while(1 == 1){
pthread_mutex_lock(&mutex1);
if(!Capture1.FRAME.empty() || !Capture2.FRAME.empty()){
cv::hconcat(Capture1.FRAME, Capture2.FRAME, Output);
}
pthread_mutex_unlock(&mutex1);
if(!Output.empty()){
NumberOfFrames = NumberOfFrames + 1;
cv::imshow("Window", Output);
}
if(cv::waitKeyEx(1) >= 0){
Capture1.STOP = 1;
Capture2.STOP = 1;
break;
}
}
time_t Seconds2;
Seconds2 = time(NULL);
int Seconds = Seconds2 - Seconds1;
int FPS = NumberOfFrames / Seconds;
printf("[INFO]FPS %dn", FPS);
pthread_join(Capture1Thread, NULL);
pthread_join(Capture2Thread, NULL);
printf("[INFO]Donen");
return(0);
}

cvthreads.c

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <opencv2/opencv.hpp>
#include "ThreadedWebcamCapture.h"
void *Capture_Thread(void* Test){
ThreadedCapture *Testing = (ThreadedCapture *) Test;
cv::VideoCapture CAP ((*Testing).CAP_NUMBER);
CAP.set(CV_CAP_PROP_FRAME_WIDTH, (*Testing).X_RESOLUTION);
CAP.set(CV_CAP_PROP_FRAME_HEIGHT, (*Testing).Y_RESOLUTION);
while((*Testing).STOP != 1){
CAP.read((*Testing).FRAME);
}
return(NULL);
}

受威胁的WebcamCapture.h

#ifndef _THREADEDWEBCAMCAPTURE_H_
#define _THREADEDWEBCAMCAPTURE_H_
void *Capture_Thread(void* Test);
typedef struct ThreadedCaptures  {
int STOP;
int CAP_NUMBER;
int X_RESOLUTION;
int Y_RESOLUTION;
cv::Mat FRAME;
} ThreadedCapture;
#endif

您的问题是cv::hconcat函数,特别是传递两个具有不同行数的cv::Mat对象。如果你看一下cv::hconcat函数的文档,它说给定的两个矩阵必须有相同的行数。您还可以看到,在strace结果的最后一行中,有一个断言错误,指出发送到cv::hconcat的行数不相等。

"OpenCV Error: Assertion failed ("..., 205OpenCV Error: Assertion failed (src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type()) in hconcat, file /builddir/build/BUILD/opencv-3.2.0/modules/core/src/matrix.cpp, line 2865

现在,这个错误的原因在以下几行:

if(!Capture1.FRAME.empty() || !Capture2.FRAME.empty()){
cv::hconcat(Capture1.FRAME, Capture2.FRAME, Output);
}

如果任何矩阵不为空,则执行水平连接操作。然而,这意味着矩阵中的一个矩阵可以具有640x480的大小,而另一个矩阵可能具有0x0。在这种情况下,cv::hconcat抛出一个断言错误,您的程序就会崩溃。要解决此问题,请尝试将条件更改为

if(!Capture1.FRAME.empty() && !Capture2.FRAME.empty()){
cv::hconcat(Capture1.FRAME, Capture2.FRAME, Output);
}

这样,只有当两个矩阵都不为空时,才能执行运算。它们应该具有相同的行数,因为您使用相同的行数来构建ThreadedCapture对象。

参考文献

  • https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf9771c991763233866bf76b5b5d1776f

最新更新