【拜小白opencv】15-利用ROI將一幅影象疊加到另一幅影象的指定位置
阿新 • • 發佈:2019-02-01
常言道“溫故而知新”,寫此文章就是對自己目前學習內容的小小的總結與記錄。
本文力求用最簡潔的語言,詳細的程式碼將此部分內容講解清楚,但由於博主同樣是剛剛接觸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============================