OpenCV (C++) 拼接器不写入 OutputArray
OpenCV (C++) stitcher not writing to OutputArray
我目前正在玩 360° 相机,想为此使用 OpenCV 的球形变形器。但是,每次我尝试 运行 一个使用拼接器功能的简单程序时,它都无法 return 拼接图像。我基本上只是拍摄 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;
当尝试 运行 时,它 return 出现了这个错误:
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
。我彻底搜索了网络,但找不到解决方案,因此,我们将不胜感激!
有点解决了。显然,OpenCV 的内存管理不喜欢你一直引用同一个地址。由于我的两张图片都依赖于 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");
很有魅力。不要教我冗余,我知道。我要清理并重构它,这只是我现在的解决方法。
我目前正在玩 360° 相机,想为此使用 OpenCV 的球形变形器。但是,每次我尝试 运行 一个使用拼接器功能的简单程序时,它都无法 return 拼接图像。我基本上只是拍摄 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;
当尝试 运行 时,它 return 出现了这个错误:
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
。我彻底搜索了网络,但找不到解决方案,因此,我们将不胜感激!
有点解决了。显然,OpenCV 的内存管理不喜欢你一直引用同一个地址。由于我的两张图片都依赖于 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");
很有魅力。不要教我冗余,我知道。我要清理并重构它,这只是我现在的解决方法。