2016-02-28 75 views
1

我試過這段代碼,我在這裏得到了。它用於在C++的單個窗口中顯示多個圖像。我也在程序中包含了opencv 3.0庫。以下是代碼。我想加載2張圖片,但只有第一張(1.jpg)出現,但是當我把image2等於cv :: imread(「1.jpg」);出現1.jpg的兩個圖像。我對這個真的很陌生,我不明白我在哪裏會出錯。我希望有一個人可以幫助我。謝謝。在單個窗口上顯示多個圖像無法正常工作(C++ VS12)

int main(int argc, char *argv[]) 
{ 
    // read an image 
    cv::Mat image1= cv::imread("1.jpg"); 
    cv::Mat image2= cv::imread("2.jpg"); 

    int dstWidth = image1.cols; 
    int dstHeight = image1.rows * 2; 

    cv::Mat dst = cv::Mat(dstHeight, dstWidth, CV_8UC3, cv::Scalar(0,0,0)); 
    cv::Rect roi(cv::Rect(0,0,image1.cols, image1.rows)); 
    cv::Mat targetROI = dst(roi); 
    image1.copyTo(targetROI); 
    targetROI = dst(cv::Rect(0,image1.rows,image1.cols, image1.rows)); 
    image2.copyTo(targetROI); 

    // create image window named "My Image" 
    cv::namedWindow("OpenCV Window"); 
    // show the image on window 
    cv::imshow("OpenCV Window", dst); 
    // wait key for 5000 ms 
    cv::waitKey(5000); 

    return 0; 
} 

這是該計劃的上述

enter image description here

回答

0

您的代碼工程確定對我來說,如果圖像的大小相同的結果。否則,調用

image2.copyTo(targetROI); 

將在dst複製image2到一個新創建的圖像,並不像你期望的那樣。


如果你想用普通的工作,你應該:

1)設置dstWidthdstHeight,如:

int dstWidth = max(image1.cols, image2.cols); 
int dstHeight = image1.rows + image2.rows; 

2)設置第二個投資回報率的大小所述第二圖像:

targetROI = dst(cv::Rect(0, image1.rows, image2.cols, image2.rows)); 
//           ^  ^

從意見,以示配置2×2 4張圖片,你需要更多一點的工作:

#include <opencv2\opencv.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 

int main() 
{ 
    // read an image 
    cv::Mat image1 = cv::imread("path_to_image1"); 
    cv::Mat image2 = cv::imread("path_to_image2"); 
    cv::Mat image3 = cv::imread("path_to_image3"); 
    cv::Mat image4 = cv::imread("path_to_image4"); 

    ////////////////////// 
    // image1 image2 
    // image3 image4 
    ////////////////////// 

    int max13cols = max(image1.cols, image3.cols); 
    int max24cols = max(image2.cols, image4.cols); 
    int dstWidth = max13cols + max24cols; 

    int max12rows = max(image1.rows, image2.rows); 
    int max34rows = max(image3.rows, image4.rows); 
    int dstHeight = max12rows + max34rows; 

    cv::Mat dst = cv::Mat(dstHeight, dstWidth, CV_8UC3, cv::Scalar(0, 0, 0)); 

    cv::Rect roi(cv::Rect(0, 0, image1.cols, image1.rows)); 
    image1.copyTo(dst(roi)); 

    roi = cv::Rect(max13cols, 0, image2.cols, image2.rows); 
    image2.copyTo(dst(roi)); 

    roi = cv::Rect(0, max12rows, image3.cols, image3.rows); 
    image3.copyTo(dst(roi)); 

    roi = cv::Rect(max13cols, max12rows, image4.cols, image4.rows); 
    image4.copyTo(dst(roi)); 

    cv::imshow("OpenCV Window", dst); 
    cv::waitKey(0); 

    return 0; 
} 
+0

太謝謝你了!它非常完美!比方說,如果我想要更多的圖像像4x4,我把它設置爲這樣? int dstWidth = max(image1.cols,image2.cols,image3.cols,image4.cols); int dstHeight = image1.rows + image2.rows + image3.rows + image4.rows; – TxRx

+0

非常感謝! – TxRx

+0

不,4x4有點麻煩......我會在幾分鐘內發佈一個示例 – Miki