2016-02-28 124 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