2016-12-19 3 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/ core/add_images/add_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

Я не использовал imshowpair, так что я не знаю, полный спектр того, что он делает, но в данном случае это выглядит как он просто взяв первое изображение в качестве зеленого канала и второго изображения в качестве синих и красных каналов:

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

Разница заключается в том, что вы хотите запустить свой код в режиме «отладки» или «выпуска». Используя ваш код, он выдавал мне исключение, и у меня только были выпущены .lib-файлы из opencv (я скомпилировал библиотеку только для режима выпуска)! – BugReader

+0

Это действительно тривиальное изменение. Некоторая обратная связь была бы рада. В противном случае некоторые атрибуции были бы уместными. – beaker

Смежные вопросы