2016-12-19 156 views
1

在Matlab中,可能會顯示兩個圖像重疊,這對於顯示兩個圖像如何相互對齊非常有用。在openCV中顯示兩個彼此重疊的圖像

例如看看下面的代碼:

img1 = zeros(100,100); 
img1(20:50, 10:40) = 255; 
img2 = zeros(100, 100); 
img2(35:65, 35:65) = 255; 
imshowpair(img1, img2); 

它創建如下圖:

enter image description here

是否有任何內置函數或OpenCV庫沒有辦法做這樣(在C++)?

+0

這可能會幫助:http://docs.opencv.org/2.4/doc/tutorials/核心/ adding_images/adding_images.html –

回答

2

你想用addWeighted如記錄here

Mat img1 = Mat(100,100,CV_8UC3,Scalar::all(0)); 
Mat img2 = Mat(100,100,CV_8UC3,Scalar::all(0)); 
rectangle(img1, Rect(20,10,50,40), Scalar(0,255,0), -1); 
rectangle(img2, Rect(35,35,65,65), Scalar(255,0,255), -1); 
Mat result; 
addWeighted(img1, 0.5, img2, 0.5, 0.0, result); 
imshow("SO question", result); 
waitKey(10); 
+0

是的,謝謝,它正在工作,但不如Matlab。 – BugReader

+0

它不如那麼好? – zeFrenchy

+0

我一直在尋找一種精確的圖像表示方式,與matlab所做的一樣。 – BugReader

2

我沒有使用過​​,所以我不知道的全方位它做什麼,但在這種情況下,它看起來像它只是服用第一圖像作爲綠色通道和藍色和紅色通道中的第二圖像:

cv::Mat img1 = cv::Mat::zeros(100, 100, CV_8U); 
rectangle(img1, cv::Rect(10,20,30,30), 255, CV_FILLED); 

cv::Mat img2 = cv::Mat::zeros(100, 100, CV_8U); 
rectangle(img2, cv::Rect(35,35,30,30), 255, CV_FILLED); 

std::vector<cv::Mat> channels; 
cv::Mat imgPair; 

channels.push_back(img2); 
channels.push_back(img1); 
channels.push_back(img2); 

merge(channels, imgPair); 

imshow("imgPair", imgPair); 
cv::waitKey(0); 

輸出:

imgPair result

0

這是工作,當你想只在調試模式下使用OpenCV庫中的代碼:

void showImagePairs(const cv::Mat &img1, const cv::Mat &img2) { 

    std::vector<cv::Mat> channels; 
    cv::Mat imgPair; 

    channels.push_back(img2); 
    channels.push_back(img1); 
    channels.push_back(img2); 

    cv::merge(&channels[0], channels.size(), imgPair); 

    cv::imshow("imgPair", imgPair); 

    int c = cvWaitKey(40); 

} 
+0

好的。我不確定這與我的答案有什麼不同,但我認爲,你有它的工作是好的。 – beaker

+0

不同之處在於,您想要在「調試」或「釋放」模式下運行代碼。使用你的代碼它給了我異常,我只有從opencv釋放.lib文件(我編譯的庫僅用於發佈模式)! – BugReader

+0

這確實是一個微不足道的變化。有些反饋會受到歡迎。如果做不到這一點,一些歸因將是適當的。 – beaker