按本方法设置的任意形状的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;
}