Я создал многопоточную программу, которая получает один кадр в потоке получения изображения и передает его в поток обработки изображения. Изображение, кажется, копируется полностью, но opencv падает при вызове функции inRange. Я собираюсь кратко обрисовать поток и вставить несколько фрагментов кода, чтобы показать, как изображения копируются. Первое: это opencv 2.4.13
для потока данных, у меня есть один поток, считанный с камеры, и вставляю изображение в коврик, доступный для обоих потоков. Я использую блокировку при доступе к этим потокам, чтобы гарантировать, что чтение в потоке CV не произойдет, в то время как запись происходит в потоке получения изображения. Ниже приведены фрагменты кода каждой части.
Mat Temp=Mat(Instance->Frame->rows,Instance->Frame->cols,CV_8UC4);
CLEyeCameraGetFrame(*(Instance->CameraInstance),Temp.data);
//image acquisition thread
Instance->imgMtx->lock();
*(Instance->Frame) = Temp.clone();
Instance->imgMtx->unlock();
//image copy used in the CV thread
imgMtx.lock();
frame = Frame.clone();
imgMtx.unlock();
//declared variables
int LowH, HighH, LowS, HighS, LowV, HighV;
cv::Mat binary, hsv;
//image conversion in the CV code
cv::cvtColor(frame, hsv, CV_BGR2HSV);
//inRange call where it crashes
inRange(hsv, cv::Scalar(LowH, LowS, LowV), cv::Scalar(HighH, HighS, HighV), binary);
Когда происходит сбой, похоже, что функция inRange пыталась определить тип получаемых аргументов. Ниже приведен соответствующий код в OpenCV
void cv::inRange(InputArray _src, InputArray _lowerb,
InputArray _upperb, OutputArray _dst)
{
int skind = _src.kind(), lkind = _lowerb.kind(), ukind = _upperb.kind();
Он падает на что-то в последней строке. Я не могу точно сказать, что здесь происходит, но opencv просто продолжает вызывать функцию type
до тех пор, пока она не достигнет стекопотока. Я прошел и на каждом этапе убедился, что изображения могут быть отображены с помощью imshow. Я понимаю, что это не вся картина, но я не знаю, что еще проверить. Любая помощь будет оценена.
РЕДАКТИРОВАТЬ: насколько я могу судить, он попадает в бесконечность, пытаясь определить тип скаляра. Ниже приведен код этой функции внутри opencv.
int _InputArray::type(int i) const
{
int k = kind();
if( k == MAT )
return ((const Mat*)obj)->type();
if( k == EXPR )
return ((const MatExpr*)obj)->type();
if( k == MATX || k == STD_VECTOR || k == STD_VECTOR_VECTOR )
return CV_MAT_TYPE(flags);
if( k == NONE )
return -1;
if( k == STD_VECTOR_MAT )
{
const vector<Mat>& vv = *(const vector<Mat>*)obj;
CV_Assert( i < (int)vv.size() );
return vv[i >= 0 ? i : 0].type();
}
if( k == OPENGL_BUFFER )
return ((const ogl::Buffer*)obj)->type();
CV_Assert( k == GPU_MAT );
//if( k == GPU_MAT )
return ((const gpu::GpuMat*)obj)->type();
}