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 ...
随机推荐
- servlet和spring框架的关系
1.Servlet是什么? servlet就是一个Java接口,是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能. 由其他内部厂商如tomcat,JBoss内部实现web的功能. ...
- 本地JAR包如何上传私有仓库
需求背景 有些第三方的jar包需要手动上传到maven私有仓库,以便通过maven来管理依赖. 为简化手动上传的jar包的操作步骤,所以整了个脚本,在使用时只需修改相应变量即可. 脚本示例 #!/bi ...
- kubectl的vistor模式
package main import ( "encoding/json" "encoding/xml" "log" ) type Visi ...
- css布局、动画要点
background属性 属性解释background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设 ...
- ComPiler200003:Story-Oriented Programming
Story-Oriented Programming MAY 25TH, 2018 http://www.brandonkeown.com/2018/05/story-oriented-program ...
- chatgpt
openAI 需要外国手机验证可以使用 当时注册的时候怎么都不成功,后来换了一个浏览器,还是怎么也不行,后再不知怎的就好了 还需要FQ,我用的是日本的线路
- ping Hyper-V内虚拟机网络延迟
- vuex记录
vuex就是vue中管理状态的地方,控制着组件之间的数据: 5大核心,通常只要有state和mutation就能满足vuex最基本的需求 1.state 项目存放各种状态的地方 2.mutation ...
- java 动手动脑 方法重载
如下代码://MethodOverload.java //Using overloaded methods package HJssss; public class zhuce { public st ...
- JS学习-PromiseWorker
PromiseWorker PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise. PromiseWo ...