2016-02-09 3 views
0

У меня есть два cv::Mat объектов:OpenCV скопировать данные из * Мата к мату

cv::Mat *frameLeftRemap; 
cv::Mat frameLeft2; 

потоки данные в * frameLeftRemap из камеры. Мне нужно скопировать данные в frameLeft2, а затем удалить frameLeftRemap, чтобы избежать артефактов фрейма, которые я вижу. (Это было предложено в службу поддержки производителя камеры.)

функция:

void ProcessImageLeft(AVT::VmbAPI::FramePtr pFrame) 
    { 
     VmbUchar_t *pBuffer; 
     VmbUint32_t FrameWidth; 
     VmbUint32_t FrameHeight; 


     //prepare frame information: 
     pFrame->GetWidth(FrameWidth); 
     pFrame->GetHeight(FrameHeight); 
     pFrame->GetImage(pBuffer); 
     //edited 
     Mat1b imageL(FrameHeight, FrameWidth, (uchar*)pBuffer); 

     cv::remap(imageL, *frameLeftRemap, mx1, my1, cv::INTER_LINEAR); 

     frameLeft2 = frameLeftRemap->clone(); 

     //frameLeftRemap->copyTo(frameLeft2); 


     cv::imshow("right", frameLeft2); 
     cv::waitKey(1); 
     delete frameLeftRemap; 


    } 

как CopyTo и клон дают ошибку:

this is nullPtr. read access violation 

Что я здесь делаю неправильно?

+0

Пожалуйста, отправьте сообщение [mcve]. Как уже указывалось, это должно работать правильно, если ваши изображения все еще действительны. Кроме того, как правило, плохой идеей использовать 'Mat *', так как вы, вероятно, нарушите внутренний подсчет ссылок (как вы, вероятно, здесь) – Miki

+0

отредактирован. Благодарю. – anti

+0

Почему вы даже используете 'IplImage'? Пожалуйста, избегайте устаревших C api. Пожалуйста, рефакторируйте этот код, чтобы использовать только 'Mat'. Ошибка, вероятно, будет решена уже – Miki

ответ

0

frameL= frameLeftRemap->clone(); должен работать правильно. Кажется, у вас проблемы в frameL. Попробуйте показать его с помощью cv::imshow или cv::imwrite, чтобы убедиться, что он был поврежден перед клонированием. Затем исправьте исходную проблему. Если вы разместите код, мы поможем вам больше.

Смежные вопросы