opencv 设置任意形状的ROI的各种方法

按本方法设置的任意形状的ROI区域,不能带有修改的关联性,具体看代码。能有关联性的设置方法还没找到。。


#include "stdafx.h"
#include 


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;
}

你可能感兴趣的:(OpenCV)