这篇文章主要介绍了C++如何实现批量图片拼接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++如何实现批量图片拼接文章都会有所收获,下面我们一起来看看吧。
剑川网站建设公司成都创新互联,剑川网站设计制作,有大型网站制作公司丰富经验。已为剑川上1000家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的剑川做网站的公司定做!
具体代码如下
/**函数功能:不同图片拼接 * 参数: * vectorpic_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 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 tmp_cols; vector tmp_rows; //获取图片数量 int pic_num = pic_list.size(); vector input(pic_num); Mat merge; for(int i=0; i = 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 temp(pic_num); //摆放图片 for (i=0;i = 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_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< temp(pic_num); merge.create(mergesize, CV_MAKETYPE(input[0].depth(), 3));//rgb 3通道 merge = Scalar::all(0); for (i=0;i = 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#include #include #include using namespace std; using namespace cv; int main(){ vector 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++如何实现批量图片拼接”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++如何实现批量图片拼接”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注创新互联行业资讯频道。