欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)批量圖片拼接

 更新時(shí)間:2021年07月23日 14:58:31   作者:Lijilong0303  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)批量圖片拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言中g(shù)etchar和putchar的使用方法詳解

    C語(yǔ)言中g(shù)etchar和putchar的使用方法詳解

    我們知道scanf函數(shù)可以從鍵盤(pán)輸入信息,而printf則可以輸出信息,同樣地,getchar和putchar也有同樣的功能,下面我來(lái)給大家介紹putchar和getchar的使用方法,需要的朋友可以參考下
    2023-08-08
  • C/C++實(shí)現(xiàn)H264文件解析

    C/C++實(shí)現(xiàn)H264文件解析

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C++實(shí)現(xiàn)H264文件以及一段H264碼流解析,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • C++ cin.get用法案例詳解

    C++ cin.get用法案例詳解

    這篇文章主要介紹了C++ cin.get用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言中如何判斷質(zhì)數(shù)

    C語(yǔ)言中如何判斷質(zhì)數(shù)

    這篇文章主要介紹了C語(yǔ)言中的判斷質(zhì)數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C++11中std::packaged_task的使用詳解

    C++11中std::packaged_task的使用詳解

    這篇文章主要介紹了C++11中std::packaged_task的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Visual Studio 2022 的安裝和創(chuàng)建C++項(xiàng)目(圖文教程)

    Visual 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ú)效值定義與判定的解決辦法

    深入C++浮點(diǎn)數(shù)無(wú)效值定義與判定的解決辦法

    本篇文章是對(duì)C++中浮點(diǎn)數(shù)無(wú)效值定義與判定進(jìn)行了介紹,需要的朋友參考下
    2013-05-05
  • C++調(diào)用Go方法的字符串傳遞問(wèn)題及解決方案

    C++調(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-11
  • C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼

    C++實(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-12
  • C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán)

    C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了C++基于棧的深搜算法實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論