2014-01-05 3 views
0

В моей программе мне нужно немного смешать C++ и c api.opencv: Convert Mat to IplImage Issue

я захватить изображение с C API и получить один кадр:

CvCapture* capture = 0; 
capture = cvCaptureFromCAM(0); 

// some code 

IplImage* image = cvQueryFrame(capture); 

Затем он преобразуется в Mat, чтобы быть совместимым с новым C++ API, и я получаю ROI:

Mat captureFrame = cvarrToMat(image); 

// some code 

Mat roi = captureFrame(roiRect); 

в конце концов, я должен преобразовать Mat обратно IplImage * для работы с C API:

IplImage imgCaptureFrame = roi; 

, когда я использую это как ссылка & рои я получаю

OpenCV Error: Assertion failed (svec[j].size == dst.size && svec[j].depth() == d 
st.depth() && svec[j].channels() == 1 && i < dst.channels()) in unknown function 
, file C:\slave\builds\WinInstallerMegaPack\src\opencv\modules\core\src\convert. 
cpp, line 1306 

в коде с помощью C API.

Когда я только использую

IplImage imgCaptureFrame = captureFrame; 

вместо

IplImage imgCaptureFrame = roi; 

нет никакой ошибки, но тогда у меня нет моего КОРОЛЯ.

Что я могу сделать, чтобы преобразовать мой roi, чтобы использовать его в c api?

+1

Какое утверждение не удалось? Вы получаете описание? –

+0

Добавлена ​​информация об ошибке. – user2737037

+0

Является ли [этот ответ] (http://stackoverflow.com/a/9428938/2065121) полезным? –

ответ

2

преобразовать IplImage* в cv::Mat и сделать независимую копию, сделайте следующее:

cv::Mat captureFrame = cv::Mat(image, true); 

Чтобы создать ROI для captureFrame вы могли бы сделать что-то вроде:

cv::Rect roi; 
roi.x = 165; 
roi.y = 50; 
roi.width = 440; 
roi.height = 80; 

cv::Mat cropped = new cv::Mat(captureFrame, roi); 

и, наконец, сделать преобразование другим способом:

IplImage imgCaptureFrame = cropped; 
Смежные вопросы