基於OpenCV3實現一個窗口顯示多張圖片


前段時間一直在找如何在一個窗口中顯示多張圖片的方法,發現網上都是很陳舊的基於OpenCV1全是IplImage*的格式,轉換為Mat麻煩,關鍵是還不能好好用。所以自己這些天琢磨了一段代碼出來,完美適用Mat型圖片。 
下面貼代碼:

    using namespace std;
    using namespace cv;
    /*使用容器vector和ROI方法完成一個窗口顯示多張圖片
    Images是vector<Mat>,可有push_back方法往里面加若干圖片
    dst為輸出圖像,即將所有圖片放在一張圖片中
    imgRows是每行顯示幾張圖片,比如你顯示4張圖片填2則顯示2*2,顯示9張填3顯示3*3,可以自由選擇
    示例代碼:
    Mat img_1 = imread("1.jpg");
    Mat img_2 = imread("2.jpg");
    Mat img_3 = imread("3.jpg");
    Mat img_4 = imread("4.jpg");
    Mat dst;
    vector<Mat> manyimgV;
    manyimgV.push_back(img_1);
    manyimgV.push_back(img_2);
    manyimgV.push_back(img_3);
    manyimgV.push_back(img_4);
    ManyImages(manyimgV, dst,2);
    imshow("ManyImagesInWindow", dst);
    waitKey(0);

    備注:運行速度:約960ms,95%時間用在resize上
    */
    void ManyImages(vector<Mat> Images, Mat& dst, int imgRows)
    {
        int Num = Images.size();//得到Vector容器中圖片個數
        //設定包含這些圖片的窗口大小,這里都是BGR3通道,如果做灰度單通道,稍微改一下下面這行代碼就可以
        Mat Window(300 * ((Num - 1) / imgRows + 1), 300 * imgRows, CV_8UC3, Scalar(0, 0, 0));
        Mat Std_Image;//存放標准大小的圖片
        Mat imageROI;//圖片放置區域
        Size Std_Size = Size(300, 300);//每個圖片顯示大小300*300
        int x_Begin = 0;
        int y_Begin = 0;
        for (int i = 0; i < Num; i++)
        {
            x_Begin = (i % imgRows)*Std_Size.width;//每張圖片起始坐標
            y_Begin = (i / imgRows)*Std_Size.height;
            resize(Images[i], Std_Image, Std_Size, 0, 0, INTER_LINEAR);//將圖像設為標准大小
            //將其貼在Window上
            imageROI = Window(Rect(x_Begin, y_Begin, Std_Size.width, Std_Size.height));
            Std_Image.copyTo(imageROI);
        }
        dst = Window;
    }

  

包含的頭文件有opencv2\opencv.hpp(這個是OpencCV3里面新加的功能,包含這一個頭文件就夠了),注意使用vector容器一定要加vector這個頭文件,否則報錯。 
顯示結果如下: 

第一次寫博客,寫得可能不詳細,還請多多包涵!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM