C++實(shí)現(xiàn)批量圖片拼接
本文實(shí)例為大家分享了C++實(shí)現(xiàn)批量圖片拼接的具體代碼,供大家參考,具體內(nèi)容如下
/**函數(shù)功能:不同圖片拼接 * 參數(shù): * vector<string> pic_list : 圖片名稱列表 * int pic_cols_rows : horizontal==true,pic_cols_rows為生成圖片的行數(shù) horizontal==false,pic_cols_rows為生成圖片的列數(shù) * bool horizontal : true-先橫向后縱向合成圖片 false-先縱向后橫向合成圖片 * bool draw_rect : true-在圖片邊緣畫(huà)矩形框 false-不在圖片邊緣畫(huà)矩形框 * */ 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; //獲取圖片數(shù)量 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,畫(huà)矩形 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; //生成的圖片行數(shù) 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; } //創(chuàng)建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坐標(biāo)) 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); }
//調(diào)用 #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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++中string使用+號(hào)與int拼接方式
- 詳解C++?OpenCV實(shí)現(xiàn)圖像拼接的原理及方法
- C++ OpenCV實(shí)戰(zhàn)之圖像全景拼接
- 使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接
- 基于C++的攝像頭圖像采集及拼接程序的簡(jiǎn)單實(shí)現(xiàn)
- C++ 兩個(gè)vector對(duì)象拼接方式
- C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)
- 關(guān)于c++11與c風(fēng)格路徑拼接的速度對(duì)比
- C++使用join拼接字符串的技巧
- C++整數(shù)拼接技巧大揭秘
相關(guān)文章
C語(yǔ)言中g(shù)etchar和putchar的使用方法詳解
我們知道scanf函數(shù)可以從鍵盤(pán)輸入信息,而printf則可以輸出信息,同樣地,getchar和putchar也有同樣的功能,下面我來(lái)給大家介紹putchar和getchar的使用方法,需要的朋友可以參考下2023-08-08Visual Studio 2022 的安裝和創(chuàng)建C++項(xiàng)目(圖文教程)
本文主要介紹了Visual Studio 2022 的安裝和創(chuàng)建C++項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05深入C++浮點(diǎn)數(shù)無(wú)效值定義與判定的解決辦法
本篇文章是對(duì)C++中浮點(diǎn)數(shù)無(wú)效值定義與判定進(jìn)行了介紹,需要的朋友參考下2013-05-05C++調(diào)用Go方法的字符串傳遞問(wèn)題及解決方案
這篇文章主要介紹了C++調(diào)用Go方法的字符串傳遞問(wèn)題及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼
在使用c++做界面開(kāi)發(fā)的時(shí)候,尤其是實(shí)現(xiàn)白板功能時(shí)需要自己實(shí)現(xiàn)一套撤銷重做功能.如果是qt則有QUndoable對(duì)象,可以直接拿來(lái)用。但是如果是使用gdi繪圖,則可能需要自己實(shí)現(xiàn)了。本文就來(lái)用C++實(shí)現(xiàn)自定義撤銷重做功能,需要的可以參考一下2022-12-12C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán)
這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02