OpenCV在iOS上的简单拼接示例失败,出现大小调整错误



我试图在iOS应用程序中使用OpenCV XCFramework运行一个简单的照片拼接示例,但在调用stitcher->stitch(imgs, pano)时出现以下错误失败

ibc++abi: terminating with uncaught exception of type cv::Exception: OpenCV(4.6.0-dev) /Users/gpdawson/Documents/Apps/OpenCV/opencv/modules/imgproc/src/resize.cpp:4065: error: (-215:Assertion failed) inv_scale_x > 0 in function 'resize'

被调用的代码如下:

+ (void)testStitchSimple {
UIImage *uiImage;
cv::Mat opencvImage1;
cv::Mat opencvImage2;
cv::Mat opencvImage3;
vector<cv::Mat> imgs;
uiImage = [UIImage imageNamed:@"first.jpg"];
UIImageToMat(uiImage, opencvImage1);
imgs.push_back(opencvImage1);
uiImage = [UIImage imageNamed:@"second.jpg"];
UIImageToMat(uiImage, opencvImage2);
imgs.push_back(opencvImage2);
uiImage = [UIImage imageNamed:@"third.jpg"];
UIImageToMat(uiImage, opencvImage3);
imgs.push_back(opencvImage3);
Stitcher::Mode mode = Stitcher::PANORAMA;
Stitcher *stitcher = Stitcher::create(mode);  // THIS IS THE CAUSE - SEE ANSWER
Mat pano;
Stitcher::Status status;
status = stitcher->stitch(imgs, pano); // FAILS WITH RESIZE ERROR MESSAGE
}

请注意,我已经尝试使用不同的源图像,并使用OpenCV的imread()函数直接从文件读取图像到opencvImage。(根据OpenCV的typeToString函数,图像类型为CV_8UC4)。

我也试过调用estimateTransform而不是stitch和error是一样的。这大概是因为stitch本身调用了estimateTransform,这是在两种情况下必须发生相同错误的地方。

任何帮助找到这个错误的原因,或者至少解决它,将不胜感激。

我已经找到了问题的原因。我创建缝合对象的代码显然是错误的,并且可能是不适当地将Objective-C对象指针与c++ Ptr混合的结果。

Stitcher *stitcher = Stitcher::create(mode); // INCORRECT
cv::Ptr<Stitcher> stitcher = Stitcher::create(mode); // CORRECT

通过错误的调用,创建了一个可用的stitcher对象,但是它的内部存储(以及它的所有初始默认设置)都是nil/0值。由于这些不正确的默认值,后续对stitch的调用失败。

一旦对象被正确创建,拼接就会成功执行。

最新更新