C++实现批量图片拼接

本文实例为大家分享了C++实现批量图片拼接的具体代码,供大家参考,具体内容如下

/**函数功能:不同图片拼接

* 参数:

* vector<string> pic_list : 图片名称列表

* int pic_cols_rows : horizontal==true,pic_cols_rows为生成图片的行数

horizontal==false,pic_cols_rows为生成图片的列数

* bool horizontal : true-先横向后纵向合成图片 false-先纵向后横向合成图片

* bool draw_rect : true-在图片边缘画矩形框 false-不在图片边缘画矩形框

*

*/

void mergeDiffPic(vector<string> pic_list, int pic_cols_rows, string output_file, bool horizontal=true, bool draw_rect=false)

{

int pic_cols = 0;

int pic_rows = 0;

int max_cols=0;

int max_rows=0;

int size_cols=0;

int size_rows=0;

vector<int> tmp_cols;

vector<int> tmp_rows;

//获取图片数量

int pic_num = pic_list.size();

vector<Mat>input(pic_num);

Mat merge;

for(int i=0; i<pic_num; i++){

input[i] = imread(pic_list[i]);

//draw_rect为true,画矩形

if(draw_rect){

Rect rect = Rect(0,0,input[i].cols,input[i].rows);

rectangle(input[i],rect,Scalar(0, 0, 255));

}

}

//按水平方向合成

if (horizontal){

pic_cols = pic_cols_rows;

pic_rows = pic_num/pic_cols;

//生成的图片行数

if (pic_num%pic_cols != 0) pic_rows += 1;

int i = 0;

int j = 0;

for (i=0;i<pic_rows;i++){

max_cols = 0;

//保存每行图片的最大高度,方便后面确定图片的摆放位置

tmp_rows.push_back(size_rows);

max_rows = 0;

for (j=0;j<pic_cols;j++){

if ((i*pic_cols+j) >= pic_num) break;

//保存每行图片的最大宽度,用于确定合成图的宽度

max_cols += input[i*pic_cols+j].cols;

max_rows = (max_rows>input[i*pic_cols+j].rows?max_rows:input[i*pic_cols+j].rows);

}

//合成图的宽度和高度

size_cols = (max_cols>size_cols?max_cols:size_cols);

size_rows += max_rows;

if ((i*pic_cols+j) >= pic_num) break;

}

//创建size_cols×size_rows大小的空白图片,用于摆放小图

Size mergesize(size_cols,size_rows);

merge.create(mergesize, CV_MAKETYPE(input[0].depth(), 3));//rgb 3通道

merge = Scalar::all(0);

vector<Mat>temp(pic_num);

//摆放图片

for (i=0;i<pic_rows;i++){

int sum_cols = 0;

for (j=0;j<pic_cols;j++){

if ((i*pic_cols+j) >= pic_num) break;

//确定第(i*pic_cols+j)张图在merge上的位置

temp[i*pic_cols+j] = merge(Rect(sum_cols, tmp_rows[i], input[i*pic_cols+j].cols, input[i*pic_cols+j].rows));

//下一张图的起始位置(x坐标)

sum_cols += input[i*pic_cols+j].cols;

input[i*pic_cols+j].copyTo(temp[i*pic_cols+j]);

}

if ((i*pic_cols+j) >= pic_num) break;

}

}else{

pic_rows = pic_cols_rows;

pic_cols = pic_num/pic_rows;

if (pic_num%pic_rows != 0) pic_cols += 1;

int i = 0;

int j = 0;

for (i=0;i<pic_cols;i++){

max_rows = 0;

tmp_cols.push_back(size_cols);

max_cols = 0;

for (j=0;j<pic_rows;j++){

if ((i*pic_rows+j) >= pic_num) break;

max_rows += input[i*pic_rows+j].rows;

max_cols = (max_cols>input[i*pic_rows+j].cols?max_cols:input[i*pic_rows+j].cols);

}

size_rows = (max_rows>size_rows?max_rows:size_rows);

size_cols += max_cols;

if ((i*pic_rows+j) >= pic_num) break;

}

//std::cout<<size_cols<<std::endl;

//std::cout<<size_rows<<std::endl;

Size mergesize(size_cols,size_rows);

vector<Mat>temp(pic_num);

merge.create(mergesize, CV_MAKETYPE(input[0].depth(), 3));//rgb 3通道

merge = Scalar::all(0);

for (i=0;i<pic_cols;i++){

int sum_rows = 0;

for (j=0;j<pic_rows;j++){

if ((i*pic_rows+j) >= pic_num) break;

temp[i*pic_rows+j] = merge(Rect(tmp_cols[i], sum_rows, input[i*pic_rows+j].cols, input[i*pic_rows+j].rows));

sum_rows += input[i*pic_rows+j].rows;

input[i*pic_rows+j].copyTo(temp[i*pic_rows+j]);

}

if ((i*pic_rows+j) >= pic_num) break;

}

}

//显示图片

//imshow("merge", merge);

//保存图片

imwrite(output_file.c_str(), merge);

//waitKey(0);

}

//调用

#include<iostream>

#include<string>

#include<vector>

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main(){

vector<string> pic_list;

pic_list.push_back("1.jpg");

pic_list.push_back("2.jpg");

pic_list.push_back("3.jpg");

mergeDiffPic(pic_list, 2, "merge1.jpg");

mergeDiffPic(pic_list, 1, "merge2.jpg",false);

mergeDiffPic(pic_list, 3, "merge3.jpg",false,true);

return 0;

}

//编译

g++ merge.cpp `pkg-config --cflags --libs opencv`

merge1.jpg

merge2.jpg

merge3.jpg

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C++实现批量图片拼接 的全部内容, 来源链接: utcz.com/p/246578.html

回到顶部