opencv 設置任意形狀的ROI的各種方法

按本方法設置的任意形狀的ROI區域,不能帶有修改的關聯性,具體看代碼。能有關聯性的設置方法還沒找到。。


#include "stdafx.h"
#include <opencv2\opencv.hpp>


int main()
{
	std::string imageName("C:\\scenery.jpg");
	cv::Mat src = cv::imread(imageName, CV_LOAD_IMAGE_UNCHANGED);

	// 第一種方法:rowRange colRange
	int rowBegin = 0, rowEnd = 100, colBegin = 0, colEnd = 100;
	cv::Mat roi1 = src.rowRange(rowBegin, rowEnd).colRange(colBegin, colEnd);
	roi1.setTo(0); // 對ROI操作會影響到原圖(如希望不影響,可以在拷貝一份)
	cv::Mat roiCopy = roi1.clone(); // copyTo

	// 第二種方法:Rect
	int xOrigin = 100, yOrigin = 100, xWidth = 100, yHeight = 200;
	cv::Rect rectROI(xOrigin, yOrigin, xWidth, yHeight);
	cv::Mat roi2 = src(rectROI);
	roi2.setTo(128); // 對ROI操作會影響到原圖
	
	// 第三種方法,針對不規則的 roi 區域:copyTo 該方法並不是真正意義的ROI,opencv不支持修改可影響原圖的任意ROI
	cv::Mat mask = cv::Mat::zeros(src.size(), CV_8UC1);
	cv::circle(mask, cv::Point2i(500,500), 200, cv::Scalar(255), -1); // 把感興趣的區域,設置成255,其餘爲0
	cv::Mat roi3;
	src.copyTo(roi3, mask); // 本質上是拷貝數據(或者使用"與"操作)
	// cv::Mat roi4 = src & mask; // 需要src是單通道
	roi3.setTo(255); // 不會對ROI操作會影響到原圖


	return 0;
}

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