成都创新互联网站制作重庆分公司

C++如何实现批量图片拼接

这篇文章主要介绍了C++如何实现批量图片拼接的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++如何实现批量图片拼接文章都会有所收获,下面我们一起来看看吧。

剑川网站建设公司成都创新互联,剑川网站设计制作,有大型网站制作公司丰富经验。已为剑川上1000家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的剑川做网站的公司定做!

具体代码如下

/**函数功能:不同图片拼接
 *     参数:
 *          vector 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 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();
    vectorinput(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);
        
        vectortemp(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

C++如何实现批量图片拼接

merge2.jpg

C++如何实现批量图片拼接

merge3.jpg

C++如何实现批量图片拼接

关于“C++如何实现批量图片拼接”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++如何实现批量图片拼接”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注创新互联行业资讯频道。


本文名称:C++如何实现批量图片拼接
网页路径:http://cxhlcq.com/article/poopoe.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部