Сшиватель OpenCV (C++) не записывает в OutputArray

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

Вот код:

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 является пустым объектом, хотя я передаю его как OutputArrayto stitcher.stitch. Я тщательно искал в Интернете и не смог найти решение, поэтому любая помощь будет принята с благодарностью!


person neobanshee    schedule 26.10.2016    source источник
comment
Разве это не должно быть: 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));   -  person Miki    schedule 26.10.2016
comment
Спасибо за быстрый ответ! Я не знал о перекрытии, так что это хорошо знать. Однако он все еще не работает с вашим кодом. Я получаю эту ошибку: Assertion failed (size.width>0 && size.height>0) in imshow   -  person neobanshee    schedule 26.10.2016


Ответы (1)


Типа решил. По-видимому, управление памятью 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");

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

person neobanshee    schedule 31.10.2016