C++대량 이미지 조합 실현

6311 단어 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

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기