2016-10-26 3 views
2

저는 현재 360 ° 카메라로 놀고 있는데 OpenCV의 구형 왜곡기를 사용하고 싶습니다. 그러나 stitcher 기능을 사용하는 간단한 프로그램을 실행할 때마다 스티칭 된 이미지가 반환되지 않습니다. 저는 기본적으로 360도 사진을 찍어서 두 개의 개별 사진 (앞면과 뒷면 렌즈)으로 나누고 함께 다시 스티치하고 싶습니다.OpenCV (C++) stitcher가 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 내가 OutputArraystitcher.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

빠른 답장을 보내 주셔서 감사합니다! 겹치는 부분을 알지 못 했으니 까. 그것은 여전히 ​​귀하의 코드를 사용하여 작동하지 않습니다. 이 오류가 발생했습니다 : '어설 션 실패 (size.width> 0 && size.height> 0) in imshow' – neobanshee

답변

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"); 

매력처럼 작동한다. 중복에 대해 가르쳐주지 마라. 내가 정리하고 리펙토링 할거야. 이건 지금 당장의 해결 방법 일 뿐이야.