图像拼接函数

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

//图像拼接函数
//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. servlet和spring框架的关系

    1.Servlet是什么? servlet就是一个Java接口,是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能. 由其他内部厂商如tomcat,JBoss内部实现web的功能. ...

  2. 本地JAR包如何上传私有仓库

    需求背景 有些第三方的jar包需要手动上传到maven私有仓库,以便通过maven来管理依赖. 为简化手动上传的jar包的操作步骤,所以整了个脚本,在使用时只需修改相应变量即可. 脚本示例 #!/bi ...

  3. kubectl的vistor模式

    package main import ( "encoding/json" "encoding/xml" "log" ) type Visi ...

  4. css布局、动画要点

    background属性 属性解释background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设 ...

  5. ComPiler200003:Story-Oriented Programming

    Story-Oriented Programming MAY 25TH, 2018 http://www.brandonkeown.com/2018/05/story-oriented-program ...

  6. chatgpt

    openAI 需要外国手机验证可以使用 当时注册的时候怎么都不成功,后来换了一个浏览器,还是怎么也不行,后再不知怎的就好了 还需要FQ,我用的是日本的线路

  7. ping Hyper-V内虚拟机网络延迟

  8. vuex记录

    vuex就是vue中管理状态的地方,控制着组件之间的数据: 5大核心,通常只要有state和mutation就能满足vuex最基本的需求 1.state 项目存放各种状态的地方 2.mutation ...

  9. java 动手动脑 方法重载

    如下代码://MethodOverload.java //Using overloaded methods package HJssss; public class zhuce { public st ...

  10. JS学习-PromiseWorker

    PromiseWorker PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise. PromiseWo ...