首页 > 其他分享 >OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

时间:2024-08-26 13:53:16浏览次数:12  
标签:mat2 mat 七十九 OpenCV 拼接 openCVDemo cv Stitcher

前言

  一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。
  本篇使用stitcher匹配,进行两张图来视野合并拼接。

 

Demo

  在这里插入图片描述

 

两张图拼接过程

步骤一:打开图片

  在这里插入图片描述

cv::Mat mat = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/29.jpg");
cv::Mat mat2 = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/30.jpg");

步骤二:加入图片进入队列

  在这里插入图片描述

std::vector<cv::Mat> vectorMat;
vectorMat.push_back(mat);
vectorMat.push_back(mat2);

步骤三:创建拼接类

  在这里插入图片描述

cv::Ptr<cv::Stitcher> pStitcher = cv::Stitcher::create(cv::Stitcher::PANORAMA, false);
//cv::Ptr<cv::Stitcher> pStitcher = cv::Stitcher::create(cv::Stitcher::SCANS, false);

步骤四:拼接

  在这里插入图片描述

cv::Ptr<cv::Stitcher> pStitcher = cv::Stitcher::create(cv::Stitcher::SCANS, false);
LOG;
cv::Stitcher::Status status = pStitcher->stitch(vectorMat, resultMat);
LOG;
if(status != cv::Stitcher::OK)
{
    std::cout << "Failed to stitch, status =" << status << std::endl;
    return;
}

  对拼接后显示所有:
  在这里插入图片描述

cv::namedWindow("mat", cv::WINDOW_NORMAL);
cv::imshow("mat", mat);
cv::resizeWindow("mat", cv::Size(400, 300));

cv::namedWindow("mat2", cv::WINDOW_NORMAL);
cv::imshow("mat2", mat2);
cv::resizeWindow("mat2", cv::Size(400, 300));

cv::namedWindow("resultMat", cv::WINDOW_NORMAL);
cv::imshow("resultMat", resultMat);
cv::resizeWindow("resultMat", cv::Size(400, 300));

步骤五:对图像进行宽高黑边裁剪(略)

  直接写个算法对周边黑色区域进行矩形探测,然后裁剪即可,方法很多,一般我们拍照的图片都不是全黑的,而黑边是全黑的,这个算法写起来有明显的特征。

 

耗时测试

原始图像1701x1280像素,耗时477ms左右

  在这里插入图片描述

  在这里插入图片描述

  原始图片1701x1280像素,拼接消耗的时间约477ms:

图像缩小至400x300像素,耗时390ms左右

  然后对其图片进行缩放后测试其耗时:
  在这里插入图片描述

  在这里插入图片描述

  将图片统一缩放为800x600分辨率,其拼接耗时在390ms左右。

图像放大至1920x1080像素,耗时530ms左右

  在这里插入图片描述

  在这里插入图片描述

  将图片放大至1920x1080分辨率,其拼接耗时在530ms左右

注意

  本次测试并不严谨,基于同样图的缩放,单纯控制像素缩放来比较,但是得出的结论可以反应图像大小的影响,最终的耗时是受多方因素影响,包括但不限于检测特征电的数量、重叠区域的大小、像素分辨率、多图。

结论

  这种方式适合对照片进行拼接,对黑边处理之后,效果很不错,但是,调用stitcher类实现时对图片的特征匹配有要求,一些特征点不够的图片无法拼接,并且,当图片较大或多张图片拼接时,速度慢。所以,倘若放到视频上,一秒钟25-60fps,那就肯定不行了。
  SIFT算法拼接,SIFT算法可以提供较高的准确率,得到的图片需要经过再次处理,才能得到相对较好的图片,
  ORB算法拼接,算法的速度非常快,但是最容易出现问题,且得到的图片需要经过再次处理,才能得到相对较好的图片,

 

函数原型

函数cv::Stitcher::create

static Ptr<Stitcher> create(Mode mode = PANORAMA, bool try_use_gpu = false);
  • 参数一:拼接模式枚举,只有2个值PANORAMA和SCANS
    PANORAMA:创建照片全景的模式,期望图像处于透视状态;
    SCANS:合成扫描的模式。期望仿射变换下的图像,默认情况下不补偿曝光。(由于咱们一般总归有角度偏移,所以这个方式对拼接图像有较高要求)
  • 参数二:是否使用gpu,这种方式编译opencv得带上gpu编译,编译opencv的时候开启支持gpu,在arm上的话,需要先确认芯片是否支持GPU,然后安装GPU驱动,然后编译opencv支持GPU选项,才可以。

函数cv::Stitcher:: stitch

CV_WRAP Status stitch(InputArrayOfArrays images, OutputArray pano);
  • 参数一:输入图像列表
  • 参数二:输出拼接结果
Status stitch(InputArrayOfArrays images, const std::vector<std::vector<Rect> > &rois, OutputArray pano);
  • 参数一:输入图像列表
  • 参数二:输入图像列表依次需要拼接的区域
  • 参数三:输出拼接结果
 

Demo源码

void OpenCVManager::testStitchImages()
{
    cv::Mat mat = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/29.jpg");
    cv::Mat mat2 = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/30.jpg");

#if 0
    // 拼接环视全景,特征点是完全不够,无法使用该方法,同时就算能拼也无法达到新能要求
    cv::Mat mat = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/front_2024-08-22_17-15-08_result.png");
    cv::Mat mat2 = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/left_2024-08-22_17-15-10_result.png");
    cv::Mat mat2 = cv::imread("D:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/right_2024-08-22_17-15-11_result.png");
#endif

#if 1
    // 对图片进行缩放,测试其拼接耗时
    cv::resize(mat, mat, cv::Size(1920, 1080));
    cv::resize(mat2, mat2, cv::Size(1920, 1080));
#endif

    std::vector<cv::Mat> vectorMat;
    vectorMat.push_back(mat);
    vectorMat.push_back(mat2);


    cv::Mat resultMat;

    cv::Ptr<cv::Stitcher> pStitcher = cv::Stitcher::create(cv::Stitcher::PANORAMA, false);
//    cv::Ptr<cv::Stitcher> pStitcher = cv::Stitcher::create(cv::Stitcher::SCANS, false);
    LOG;
    cv::Stitcher::Status status = pStitcher->stitch(vectorMat, resultMat);
    LOG;
    if(status != cv::Stitcher::OK)
    {
        std::cout << "Failed to stitch, status =" << status << std::endl;
        return;
    }


    cv::namedWindow("mat", cv::WINDOW_NORMAL);
    cv::imshow("mat", mat);
    cv::resizeWindow("mat", cv::Size(400, 300));

    cv::namedWindow("mat2", cv::WINDOW_NORMAL);
    cv::imshow("mat2", mat2);
    cv::resizeWindow("mat2", cv::Size(400, 300));

    cv::namedWindow("resultMat", cv::WINDOW_NORMAL);
    cv::imshow("resultMat", resultMat);
    cv::resizeWindow("resultMat", cv::Size(400, 300));

    cv::waitKey(0);
}
 

对应工程模板v1.69.0

  在这里插入图片描述

标签:mat2,mat,七十九,OpenCV,拼接,openCVDemo,cv,Stitcher
From: https://www.cnblogs.com/qq21497936/p/18380860

相关文章

  • OpenCV 图像处理中滤波技术介绍
    VS2022配置OpenCV环境关于OpenCV在VS2022上配置的教程可以参考:VS2022配置OpenCV开发环境详细教程图像处理中滤波技术图像滤波是图像处理中的一种重要技术,用于改善图像质量或提取图像中的特定特征。以下是一些常见的图像滤波技术:均值滤波(MeanFilter):简单且广泛使用的......
  • 《机器学习》—— OpenCV 对图片的各种操作
    文章目录1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算1、安装OpenCV库使用pip是最简单、最快捷的安装方式pipinstallopencv-python==3.4.2还需要安装一个包含了其他一些图像......
  • opencv-python图像增强十五:高级滤镜实现
    文章目录前言二、鲜食滤镜三、巧克力滤镜三,冷艳滤镜:前言在之前两个滤镜文章中介绍了六种简单的滤镜实现,它们大多都是由一个单独函数实现的接下来介绍五种结合了之前图像增强文章提的的算法的复合滤镜。本案例中的算法来自于文章一,文章二,文章三,感兴趣的小伙伴可以看......
  • 最全!万字长文总结opencv-python常用函数(一)
    文章目录一,简介:二,图像的基础操作:2.1,图像的读取显示与保存2.1.1图像的读取cv2.imread:2.1.2图像的显示cv2.imshow与等待cv2.waitKey:2.1.3图像保存cv2.imwrite:2.2,图像属性获取:2.3,图像裁剪cv2.selectROI:2.4,图像通道的拆分cv2.split:2.5,图像通道的合并cv2.merge:三,图像的数值......
  • win10系统c++与opencv 依赖环境配置
    一、VSC++配置opencv库1、下载opencv(https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.3.0/)2、在官网下载opencv3.3.0.exe文件然后解压到D盘D:\opencv3、配置系统环境:①添加环境变量:控制面板-系统-高级系统设置-环境变量-系统变量Path中添加下......
  • 十五、OpenCVSharp实现相机标定
    文章目录简介一、相机模型1.针孔相机模型2.畸变模型(径向畸变、切向畸变)二、标定板的设计和使用1.常见的标定板类型(如棋盘格、圆形标定板)2.标定板图像的采集要求三、相机标定的步骤1.角点检测和提取2.求解相机内参和外参3.标定结果的评估和优......
  • 机器视觉学习笔记和过程记录:下载安装OpenCv
    下载安装opencv1、本机已经安装了anaconda,打开对应的环境下的命令行窗口,输入python后回车,会显示python版本,本机是3.8.3:2、打开链接:Linksforopencv-python ,在网页中查找与python版本和操作系统对应的opencv版本: 本机python是3.8,系统是64位win10,所以选择opencv_python-3......
  • OpenCV——第三章(图形的绘制)
    1.线段的绘制line()方法的语法格式如下:img=cv2.line(img,pt1,pt2,color,thickness)#参数说明#img:画布#pt1:线段的起点坐标#pt2:线段的终点坐标#color:线条颜色#thickness:线条宽度接下来我们使用该方法绘制一个图形吧!!!importnumpyasnpimportcv2......
  • 计算机毕业设计opencv+pytorch疲劳驾驶检测系统 自动驾驶 面部多信息特征融合的疲劳驾
    创新点:算法模型训练、可视化、深度学习框架、疲劳监测、模拟自动驾驶检测驾驶员疲劳核心算法:基于多信息特征指标融合建立驾驶员疲劳评价体系通过构建一种驾驶员面部多信息特征融合综合评价方法,为了能够将系统检测结果更直观的体现,研究了基于一种改进的粗糙集理论对各项特征结......
  • Python的OpenCV转换图像大小
    在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理、模型输入等。下面是一个详细的代码示例,展示了如何使用OpenCV来转换图像的大小。首先,确保你已经安装了OpenCV库。如果还没有安装,可以通过pip安装:bash......