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 ...
随机推荐
- SQL_SERVER 2000启动问题
SQL Server evaluation period has expired解决办法 问题现象: 本地计算机 上的 MSSQLSERVER 服务启动后又停止了.一些服务自动停止,如果它们没有什么可 ...
- centos7 添加自定义程序为系统服务
centos6版本的系统服务是/etc/init.d启动脚本的方式,centos7采用强大的systemctl来管理系统服务,大幅提供了系统服务的运行效率,但是服务的配置和以前版本完全不同,这是很大的 ...
- Java-面向对象基础 构造方法
public class Dog {// 定义属性 String nick; String color; int age; // 定义构造方法 public Dog(String nick,Strin ...
- 93、springboot 和springcloud版本对比
https://start.spring.io/actuator/info 建议转为json
- using Spire.Pdf 合并文件夹下.pdf 文件
using Spire.Pdf private void mergePDF() { List<string> filesList = new List<string>(); D ...
- 2022-04-22内部群每日三题-清辉PMP
1.供应商建议项目经理,为了满足要求的规格,需要更换特定材料.为确保成本基准不受影响,项目经理应该审查下列哪一项? A.成本预测 B.挣值(EV)分析 C.管理储备 D.应急储备 2.项目经理确定项目 ...
- Mac预览怎么用 Mac预览功能实用技巧大全
Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具 ...
- C/C++ 关键字 static 详细解析
static关键字是一个修饰符,根const类似,被它修饰的变量和函数分别被称为静态变量和静态函数,根据修饰的对象的不同,static表现出来的作用也不同. 1. C语言中的 static 在C语言中 ...
- zk api连接超时问题 org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for
遇到 org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss fo ...
- 网络编程之 requests 模块
1. get 请求 1 import requests 2 url = 'http://api.xxxx.cn/api/user/stu_info?stu_name=xiaohei' 3 data = ...