opencv基礎03-感興趣區域

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
	Mat image = imread("lena.jpg");
	Mat logo = imread("logo.jpg");
	Mat Roi_image(image, Rect(image.cols - logo.cols, image.rows - logo.rows, logo.cols, logo.rows));
	logo.copyTo(Roi_image);
	imshow("image", image);
	waitKey();
	return 0;
}

在這裏插入圖片描述
定義 ROI 的一種方法是使用 cv::Rect 實例。正如其名,它通過指明左上角的位置(構造函數的前兩個參數)和矩形的尺寸(後兩個參數表示寬度和高度),描述了一個矩形區域。在這個例子中,我們利用圖像和標誌的尺寸來確定標誌的位置,即圖像的右下角。很明顯,整個 ROI肯定處於父圖像的內部。
ROI 還可以用行和列的值域來描述。值域是一個從開始索引到結束索引的連續序列(不含開始值和結束值),可以用 cv::Range 結構來表示這個概念。因此,一個 ROI 可以用兩個值域來定義。

imageROI= image(cv::Range(image.rows-logo.rows,image.rows),cv::Range(image.cols-logo.cols,image.cols));

使用圖像掩碼
OpenCV 中的有些操作可以用來定義掩碼。函數或方法通常對圖像中所有的像素進行操作,通過定義掩碼可以限制這些函數或方法的作用範圍。掩碼是一個 8 位圖像,如果掩碼中某個位置的值不爲 0,在這個位置上的操作就會起作用;如果掩碼中某些像素位置的值爲 0,那麼對圖像中相應位置的操作將不起作用。例如,在調用 copyTo 方法時就可以使用掩碼,我們可以利用掩碼只複製標誌中白色的部分,如下所示
在這裏插入圖片描述

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
extern void onMouse(int event, int x, int y, int flags, void* param);
int main() {
	Mat image = imread("lena.jpg");
	Mat logo = imread("logo.jpg");
	Mat logob = imread("logob.jpg");
	cout << logo.size() << endl;
	Mat Roi_image(image, Rect(image.cols - logo.cols, image.rows - logo.rows, logo.cols, logo.rows));
	Mat logoc = logo - logob;
	Mat mask(logoc);
	imshow("logoc",logoc);
	logo.copyTo(Roi_image,mask);
	imshow("image", image);
	imwrite("lenalogo.jpg",image);
	setMouseCallback("image", onMouse, reinterpret_cast<void*>(&image));

	waitKey();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章