OpenCV图像拼接函数
图像拼接函数
第一种方法:通过遍历图像,将待拼接的图像每个像素赋值给输出图像
//图像拼接函数
//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图像拼接函数的更多相关文章
- opencv-6-图像绘制与opencv Line 函数剖析
opencv-6-图像绘制与opencv Line 函数剖析 opencvc++qt 开始之前 越到后面, 写的越慢, 之前还抽空去看了下 学堂在线那篇文章提供的方法, 博客第一个人评论的我, 想想还 ...
- 【记录一个问题】macos下lldb调试opencv的一个程序,出现“failed to load objfile for”错误,并且无法调试进入opencv的函数
opencv编译使用了Debug版本,打开了BUILD_WITH_DEBUG_INFO=ON选项. 发现问题后,我又在CMAKE_CXX_FLAGS_DEBUG中设置为 -g -ggdb3,在CMAK ...
- 【麦子学院】OpenCV教程函数总结
个自带样例. parter 1: No1. adaptiveskindetector.cpp 利用HSV空间的色调信息的皮肤检測,背景不能有太多与肤色相似的颜色.效果不是特别好. No2. bagof ...
- 学习OpenCV——Gabor函数的应用
原文:http://blog.csdn.net/yao_zhuang/article/details/2532279 下载cvgabor.cpp和cvgabor.h到你的C/C++工程目录下 注:在我 ...
- Opencv常用函数
一.图像读写与简单处理 1. Mat cv::imread(const String& filename, int flags=IMREAD_COLOR). imread函数加载filenam ...
- opencv: flip函数的使用;
flip函数用于图像翻转,比较方便.在opencv中有几种形式: C++: void flip(InputArray src, OutputArray dst, int flipCode) Pytho ...
- opencv ---getRotationMatrix2D函数
getRotationMatrix2D函数 主要用于获得图像绕着 某一点的旋转矩阵 Mat getRotationMatrix2D(Point2f center, double angle, dou ...
- OpenMP并行编程应用—加速OpenCV图像拼接算法
OpenMP是一种应用于多处理器程序设计的并行编程处理方案,它提供了对于并行编程的高层抽象.仅仅须要在程序中加入简单的指令,就能够编写高效的并行程序,而不用关心详细的并行实现细节.减少了并行编程的难度 ...
- OpenCV绘图函数
OpenCV几个绘图函数 矩形 rectangle(Mat& img,Point pt1, Point pt2, const Scalar&color, int thickness=1 ...
- [opencv] copyTo函数的使用方法
OpenCV中image.copyTo()有两种形式: 1.image.copyTo(imageROI),作用是把image的内容粘贴到imageROI: 2.image.copyTo(imageRO ...
随机推荐
- jmeter取样器之KafkaProducerSampler(往kafka插入数据)
项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...
- tp5上传图片常规
前端不多说,就是使用input标签的file格式. tp5用request()->file('input的名字')接收图片,是binary格式的数据: $file = request()-> ...
- 超2T硬盘使用gpt分区及做成lvm
1.超过2T分区不能用fdisk了,用parted 分区格式化后对新的分区做lvm
- RSA 非对称加密
原文链接:https://www.jianshu.com/p/d56a72013392 RSA 是一种非对称加密算法,在实际业务中经常使用此算法对数据进行加密.但是它的加解密速度较慢,不太适用于高并发 ...
- 使用@RequestBody注解接收的实体类中的某些参数为null
原因 postman调试接口 为null的参数命名不符合"驼峰法",类似实体类A的属性 cEnterpriseId ,这种命名是不规范的 和lombook的@Data注解有关 用p ...
- 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 ...
- 怎么理解超几何分布概率公式: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),也就是: 到底要怎么 ...
- 2019-2020-1 20199318《Linux内核原理与分析》第八周作业
第7章 可执行程序工作原理 一.学习笔记 1.ELF 2.程序编译 3.连接与库 二.试验记录 1.开始先更新内核,再用test_exec.c将test.c覆盖掉 2.test.c文件中增加了exec ...
- python中的import、from import以及import as的区别
import import是python提供的用于导入模块的机制,导入的是整个模块的内容.模块可以是py.pyc.pyd,可以是系统自带的,也可以是自定义的. 使用语法:import os pytho ...
- Python循环任务,错误打包输出
有时候,多个任务循环在跑,但不想中间任何一个错误,停止主线程,但又想在主线程运行结束后,采集运行过程中所有的错误信息. 这种刁钻的想法,我自问自答,记录一下操作方法. err_list = [] ma ...