OpenCV如何实现iPhone截图垂直拼接而非水平全景拼接
解决方案
OpenCV默认拼接策略优先识别水平方向重叠区域,要实现垂直拼接优先推荐改动最小的旋转适配方案,无需修改OpenCV内核拼接逻辑:
方案1:旋转适配(推荐)
你只需要修改CVWrapper.mm中的processWithArray方法,操作步骤如下:
- 所有输入截图转成
cv::Mat之前,先统一顺时针旋转90度,把垂直方向的重叠区域转为水平方向 - 调用默认拼接逻辑得到水平拼接结果后,再把整体结果逆时针旋转90度还原方向,即可得到垂直拼接的长图
对应修改代码示例:
+ (UIImage*) processWithArray:(NSArray*)imageArray { if ([imageArray count]==0){ NSLog (@"imageArray is empty"); return 0; } std::vector<cv::Mat> matImages; for (id image in imageArray) { NSLog(@"image orientation: %ld", (long)[image imageOrientation]); if ([image isKindOfClass: [UIImage class]]) { UIImage* rotatedImage = [image rotateToImageOrientation]; cv::Mat matImage = [rotatedImage CVMat3]; // 新增:输入图像顺时针转90度 cv::rotate(matImage, matImage, cv::ROTATE_90_CLOCKWISE); matImages.push_back(matImage); } } NSLog (@"stitching..."); cv::Mat stitchedMat = stitch (matImages); // 新增:拼接结果逆时针转90度还原 cv::rotate(stitchedMat, stitchedMat, cv::ROTATE_90_COUNTERCLOCKWISE); UIImage* result = [UIImage imageWithCVMat:stitchedMat]; return result; }
如果测试时拼接方向不对,调整旋转的枚举值即可:顺时针转90度用ROTATE_90_CLOCKWISE、180度用ROTATE_180、逆时针90度用ROTATE_90_COUNTERCLOCKWISE。
方案2:修改拼接器配置
如果不想做两次旋转,你可以修改内部调用的stitch函数的实现,调整OpenCV Stitcher的参数:
- 创建Stitcher实例时设置波形校正方向为垂直:
stitcher->setWaveCorrection(cv::Stitcher::WAVE_CORRECT_VERTICAL) - 调整特征匹配的阈值,优先匹配垂直方向的特征点
该方案需要改动OpenCV拼接逻辑的初始化代码,适配成本比方案1高,非必要不推荐。
内容的提问来源于stack exchange,提问作者Zhou Haibo
相关产品推荐
相关产品推荐

