OpenCV 2 аварийно завершает работу с переполнением стека во время inRange - PullRequest
0 голосов
/ 19 февраля 2020

Я создал многопоточную программу, которая получает один кадр в потоке получения изображения и передает его в поток обработки изображения. Изображение, кажется, копируется полностью, но 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...