2016-10-26 2 views
2

В настоящее время я играю с камерой на 360 ° и хочу использовать сферическую оплочку OpenCV для этого. Однако каждый раз, когда я пытаюсь запустить простую программу, которая использует функциональность строчки, она не может вернуть сшитое изображение. Я просто фотографирую на 360 °, делю на две отдельные фотографии (передний и задний объектив) и хочу сшить их вместе.Сшиватель OpenCV (C++), не записывающий в OutputArray

Вот код:

Mat srcImage = imread("assets/360_0043.JPG"); 
Mat frontLensImage(srcImage, Rect(0, 0, srcImage.cols/2, srcImage.rows)); 
Mat rearLensImage(srcImage, Rect(srcImage.rows, 0, srcImage.cols/2, srcImage.rows)); 

vector<Mat> imagesToStitch; 
imagesToStitch.push_back(frontLensImage); 
imagesToStitch.push_back(rearLensImage); 

Mat panorama; 
Stitcher stitcher = Stitcher::createDefault(); 
if(!imagesToStitch.empty()){ 
    stitcher.stitch(imagesToStitch, panorama); 
    imshow("test", panorama); 
    waitKey(0); 
} 
else{ 
    cout << "ERROR: Image array empty" << endl; 
} 

return 0; 

При попытке запуска, он возвращает эту ошибку:

OpenCV Error: Assertion failed (ssize.area() > 0) in resize, file /build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/imgwarp.cpp, line 1834 
terminate called after throwing an instance of 'cv::Exception' 
what(): /build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/imgwarp.cpp:1834: error: (-215) ssize.area() > 0 in function resize 

При отладке panorama является пустым объектом, даже если я прохожу его как OutputArray к stitcher.stitch , Я тщательно искал в Интернете и не мог найти решение, поэтому любая помощь будет принята с благодарностью!

+0

Не должно быть: 'Mat rearLensImage (srcImage, Rect (srcImage.cols/2, 0, srcImage.cols/2, srcImage.rows));'? Однако вам нужно, чтобы изображения перекрывались ... поэтому вы можете попробовать: «Mat frontLensImage (srcImage, Rect (0, 0, 3 * srcImage.cols/4, srcImage.rows)); Mat rearLensImage (srcImage, Rect (srcImage.cols/4, 0, 3 * srcImage.cols/4, srcImage.rows)); ' – Miki

+0

Спасибо за быстрый ответ! Я не знал о перекрытии, так что это хорошо знать. Тем не менее, он по-прежнему не работает с вашим кодом. Я получаю эту ошибку: 'Assertion failed (size.width> 0 && size.height> 0) в imshow' – neobanshee

ответ

1

Kinda решил это. По-видимому, управление памятью OpenCVs не нравится, когда вы ссылаетесь на один и тот же адрес все время. Поскольку оба моих изображения зависят от srcImage, я предполагаю, что это ошибка. Я сделал быстрое обходное решение, которое выглядит так:

Mat unprocessedFrontLensImage(srcImage, Rect(0, 0, 3 * srcImage.cols/4, srcImage.rows)); 
Mat unprocessedRearLensImage(srcImage, Rect(srcImage.cols/4, 0, 3 * srcImage.cols/4, srcImage.rows)); 
imwrite("left.jpg", unprocessedFrontLensImage); 
imwrite("right.jpg", unprocessedRearLensImage); 
Mat frontLensImage = imread("left.jpg"); 
Mat rearLensImage = imread("right.jpg"); 

Работает как очарование. Я не знаю, как меня увольняют. Я собираюсь очистить и реорганизовать его, это только мой обход.

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