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