图像拼接函数

第一种方法:通过遍历图像,将待拼接的图像每个像素赋值给输出图像

//图像拼接函数
//imageVector 输入图像数组
//outputImage 输出图像
//colCount_ //每一行图像的数量
//imageWidth_,imageHeight_ //每一个输入图像的宽高,必须大小一致
void ImageStitching(vector<Mat> imageVector,Mat &outputImage,int rowImageCount_,int imageWidth_,int imageHeight_)
{
for(int i=0;i<imageVector.size();i++)
{
Mat image = imageVector.at(i);
for(int row=0;row<image.rows;row++)
{
Vec3b *pixRow = image.ptr<Vec3b>(row); //pixRow行指针
Vec3b *outPixRow = outputImage.ptr<Vec3b>(row + i/rowImageCount_*imageHeight_); //指针偏移
for(int col=0;col<image.cols;col++)
{
outPixRow[col + i%rowImageCount_*imageWidth_] = pixRow[col];
}
}
}
//  imshow("outputImage",outputImage);
}

第二种方法:OpenCV自带的拼接函数hconcat,vconcat,将多张图像同时进行拼接。

//图像拼接函数
//imageVector 输入图像数组
//outputImage 输出图像
//colCount_ //每一行图像的数量
//imageWidth_,imageHeight_ //每一个输入图像的宽高,必须大小一致
void ImageStitching(vector<Mat> imageVector,Mat &outputImage,int rowImageCount_,int imageWidth_,int imageHeight_)
{
vector<Mat> imageVec; //存放待横向合并的图片
vector<Mat> hImageVec; //存放横向合并的结果图 for(int i=0;i<imageVector.size();i++)
{
//横向合并
if((i+1)%rowImageCount_ == 0) //图片数量已经足够
{
Mat combine(imageHeight_,imageWidth_,CV_8UC3); //每一行合并的结果图
imageVec.push_back(imageVector.at(i));
hconcat(imageVec,combine); //横向合并
hImageVec.push_back(combine);
imageVec.clear(); //清空,继续添加下一行的图片
}
else
{
imageVec.push_back(imageVector.at(i));
}
}
//将横向合并后的图像竖向合成一张图
vconcat(hImageVec,outputImage);
// imshow("outputImage2",outputImage);
}

调用函数

Mat img1,img2,img3,img4,img5,img6;
vector<Mat> inputImageVector;
img1 = imread("1.bmp");
img2 = imread("2.bmp");
img3 = imread("3.bmp");
img4 = imread("4.bmp");
img5 = imread("5.bmp");
img6 = imread("6.bmp");
if(!img1.empty() && !img2.empty() && !img3.empty() && !img4.empty() && !img5.empty() && !img6.empty())
{
inputImageVector.push_back(img1);
inputImageVector.push_back(img2);
inputImageVector.push_back(img3);
inputImageVector.push_back(img4);
inputImageVector.push_back(img5);
inputImageVector.push_back(img6);
const int imageWidth = 54;
const int imageHeight = 55;
const int rowImageCount = 3;  //表示三张图片合成一行
Mat outputimage(imageHeight*2,imageWidth*3,CV_8UC3);
// const int rowCount = 2;
ImageStitching(inputImageVector,outputimage,rowImageCount,imageWidth,imageHeight);
}

效果展示

未拼接的图片

拼接后的图片

函数耗时

double start = (double)getTickCount();
test()//函数
double time = ((double)getTickCount() - to)/getTickFrequency(); //time就是函数运行的时间

可以通过getTickCount(),getTickFrequency()测试函数的耗时,如上。具体耗时还请大家自行测试~

结尾

结尾了~不知道该说些啥,嗯嗯嗯嗯呃,希望我的文章对大家有帮助吧。

OpenCV图像拼接函数的更多相关文章

  1. opencv-6-图像绘制与opencv Line 函数剖析

    opencv-6-图像绘制与opencv Line 函数剖析 opencvc++qt 开始之前 越到后面, 写的越慢, 之前还抽空去看了下 学堂在线那篇文章提供的方法, 博客第一个人评论的我, 想想还 ...

  2. 【记录一个问题】macos下lldb调试opencv的一个程序,出现“failed to load objfile for”错误,并且无法调试进入opencv的函数

    opencv编译使用了Debug版本,打开了BUILD_WITH_DEBUG_INFO=ON选项. 发现问题后,我又在CMAKE_CXX_FLAGS_DEBUG中设置为 -g -ggdb3,在CMAK ...

  3. 【麦子学院】OpenCV教程函数总结

    个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...

  4. 学习OpenCV——Gabor函数的应用

    原文:http://blog.csdn.net/yao_zhuang/article/details/2532279 下载cvgabor.cpp和cvgabor.h到你的C/C++工程目录下 注:在我 ...

  5. Opencv常用函数

    一.图像读写与简单处理 1. Mat cv::imread(const String& filename, int flags=IMREAD_COLOR). imread函数加载filenam ...

  6. opencv: flip函数的使用;

    flip函数用于图像翻转,比较方便.在opencv中有几种形式: C++: void flip(InputArray src, OutputArray dst, int flipCode) Pytho ...

  7. opencv ---getRotationMatrix2D函数

    getRotationMatrix2D函数 主要用于获得图像绕着 某一点的旋转矩阵  Mat getRotationMatrix2D(Point2f center, double angle, dou ...

  8. OpenMP并行编程应用—加速OpenCV图像拼接算法

    OpenMP是一种应用于多处理器程序设计的并行编程处理方案,它提供了对于并行编程的高层抽象.仅仅须要在程序中加入简单的指令,就能够编写高效的并行程序,而不用关心详细的并行实现细节.减少了并行编程的难度 ...

  9. OpenCV绘图函数

    OpenCV几个绘图函数 矩形 rectangle(Mat& img,Point pt1, Point pt2, const Scalar&color, int thickness=1 ...

  10. [opencv] copyTo函数的使用方法

    OpenCV中image.copyTo()有两种形式: 1.image.copyTo(imageROI),作用是把image的内容粘贴到imageROI: 2.image.copyTo(imageRO ...

随机推荐

  1. jmeter取样器之KafkaProducerSampler(往kafka插入数据)

    项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...

  2. tp5上传图片常规

    前端不多说,就是使用input标签的file格式. tp5用request()->file('input的名字')接收图片,是binary格式的数据: $file = request()-> ...

  3. 超2T硬盘使用gpt分区及做成lvm

    1.超过2T分区不能用fdisk了,用parted 分区格式化后对新的分区做lvm

  4. RSA 非对称加密

    原文链接:https://www.jianshu.com/p/d56a72013392 RSA 是一种非对称加密算法,在实际业务中经常使用此算法对数据进行加密.但是它的加解密速度较慢,不太适用于高并发 ...

  5. 使用@RequestBody注解接收的实体类中的某些参数为null

    原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...

  6. react 脚手架搭建项目 报错C:\Program Files\nodejs\node_cache\_logs\2022-12-28T14_38_28_286Z-debug-0.log

    报错内容: 解决方法: 第一步: 删除C:\Program Files\nodejs\node_cache\_logs 目录下所有文件 第二步:切换镜像 npm config set registry ...

  7. 怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n)

    怎么理解超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n) 前言:重在记录,可能出错. 超几何分布概率公式:p=C(M,k)C(N-M,n-k)/C(N,n),也就是: 到底要怎么 ...

  8. 2019-2020-1 20199318《Linux内核原理与分析》第八周作业

    第7章 可执行程序工作原理 一.学习笔记 1.ELF 2.程序编译 3.连接与库 二.试验记录 1.开始先更新内核,再用test_exec.c将test.c覆盖掉 2.test.c文件中增加了exec ...

  9. python中的import、from import以及import as的区别

    import import是python提供的用于导入模块的机制,导入的是整个模块的内容.模块可以是py.pyc.pyd,可以是系统自带的,也可以是自定义的. 使用语法:import os pytho ...

  10. Python循环任务,错误打包输出

    有时候,多个任务循环在跑,但不想中间任何一个错误,停止主线程,但又想在主线程运行结束后,采集运行过程中所有的错误信息. 这种刁钻的想法,我自问自答,记录一下操作方法. err_list = [] ma ...