1. 程式人生 > >【拜小白opencv】15-利用ROI將一幅影象疊加到另一幅影象的指定位置

【拜小白opencv】15-利用ROI將一幅影象疊加到另一幅影象的指定位置

常言道“溫故而知新”,寫此文章就是對自己目前學習內容的小小的總結與記錄。

本文力求用最簡潔的語言,詳細的程式碼將此部分內容講解清楚,但由於博主同樣是剛剛接觸OpenCV,或許表達上有些瑕疵,還望讀者能夠指教探討,大家共同進步。

博主機器配置為:VS2013+opencv2.4.13+Win-64bit。

若本文能給讀者帶來一點點啟示與幫助,我就很開心了。

===========================分割線========================

本節將利用ROI將一幅影象疊加到另一幅影象的指定位置。

具體過程見下面程式碼

=======================分割線========================

程式碼演示

/*
	利用ROI將一幅影象疊加到另一幅影象的指定位置
*/

#include <opencv2/core/core.hpp>    
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/imgproc/imgproc.hpp>   
#include <iostream>  
using namespace std;
using namespace cv;

int main()
{
	//【1】讀入兩幅影象並檢查影象是否讀取成功  
	Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\dog1.jpg");
	Mat signal = imread("D:\\OutPutResult\\ImageTest\\signal.jpg");
	if (!srcImage.data || !signal.data)
	{
		cout << "讀取影象有誤,請重新輸入正確路徑!\n";
		return false;
	}
	imshow("【萌寵】", srcImage);
	imshow("【訊號】", signal);

	//【2】定義一個Mat型別並給其設定ROI區域
	Mat imageROI = srcImage(Rect(450, 20, signal.cols, signal.rows));	//450,20為自定義起始點座標
	//【3】載入掩模(必須是灰度圖)
	Mat mask = imread("D:\\OutPutResult\\ImageTest\\signal.jpg", 0);	//引數0顯示為灰度圖
	//【4】將掩模複製到ROI
	signal.copyTo(imageROI, mask);
	//【5】顯示結果
	namedWindow("利用ROI實現影象疊加");
	imshow("利用ROI實現影象疊加", srcImage);
	waitKey(0);
	return 0;
}

==========================分割線============================

顯示結果


=========================分割線======================

程式說明

我們會看到程式裡有這麼一行程式碼
signal.copyTo(imageROI, mask);

括號裡,第一個引數表示為輸出影象,第二引數表示為掩碼(or掩模)。 我們也可以將這部分內容這麼改,見下圖:
改後的就不帶mask引數,其結果顯示都是一樣的,那麼如何理解帶mask引數的這種方式呢? 答:對於形如函式srcImage.copyto(dstImage, mask)
,mask作為一個掩模板。
函式會檢測mask中如果在某個畫素點(i, j)其值為1(只看第一通道,所以mask單通道即可)則把srcImage.at(i, j)處的值直接賦給dstImage.at(i, j);如果其值為0則dstImage.at(i, j)處保留其原始畫素值。 ===============================END============================