You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV如何实现iPhone截图垂直拼接而非水平全景拼接

解决方案

OpenCV默认拼接策略优先识别水平方向重叠区域,要实现垂直拼接优先推荐改动最小的旋转适配方案,无需修改OpenCV内核拼接逻辑:

方案1:旋转适配(推荐)

你只需要修改CVWrapper.mm中的processWithArray方法,操作步骤如下:

  1. 所有输入截图转成cv::Mat之前,先统一顺时针旋转90度,把垂直方向的重叠区域转为水平方向
  2. 调用默认拼接逻辑得到水平拼接结果后,再把整体结果逆时针旋转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的参数:

  1. 创建Stitcher实例时设置波形校正方向为垂直:stitcher->setWaveCorrection(cv::Stitcher::WAVE_CORRECT_VERTICAL)
  2. 调整特征匹配的阈值,优先匹配垂直方向的特征点
    该方案需要改动OpenCV拼接逻辑的初始化代码,适配成本比方案1高,非必要不推荐。

内容的提问来源于stack exchange,提问作者Zhou Haibo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:51:00