【13】opencv不规则roi提取
/*
以下是规则roi提取
int main() {
cv::Mat Photo = cv::imread("0003.jpg");
cv::namedWindow("origin");
cv::imshow("origin", Photo);
int h = Photo.rows;
int w = Photo.cols;
int cy = h / 2;
int cx = w / 2;
cv::Rect rect(cx + 130, cy -200, 200, 200);
cv::Mat roi = Photo(rect);
imshow("roi", roi);
cv::Mat image = roi.clone();
// 直接更改ROI,因为是直接赋值的,指向同一块内存区域,所以原图也会被修改
roi.setTo(cv::Scalar(255, 0, 0));
cv::imshow("result",Photo);
// 更改拷贝的ROI,指向不同的内存区域,所以原图不受影响
image.setTo(cv::Scalar(0, 0, 255));
cv::imshow("result2", Photo);
imshow("copy roi", image);
cv::waitKey(0);
}
*/
inRange()函数
OpenCV中的inRange()函数可实现二值化功能,可以同时针对多通道进行操作

关于位运算中mask的使用详解:
https://www.cnblogs.com/skyfsm/p/6894685.html
学习代码(//TODO:复现)
int main(){ // 获取不规则形状的ROI,通过inRange函数 cv::Mat src2 = cv::imread("0008.jpg"); imshow("src2", src2); cv::Mat hsv, mask; cvtColor(src2, hsv, cv::COLOR_BGR2HSV); imshow("hsv", hsv); inRange(hsv, cv::Scalar(0, 0, 0), cv::Scalar(128,128,255), mask); imshow("mask", mask); // 通过mask提取人物部分,即我们的ROI。mask的白色区域才会执行与操作,黑色区域不执行 cv::Mat person; bitwise_not(mask, mask); imshow("mask2", mask); bitwise_and(src2, src2, person, mask); imshow("person", person); // 生成蓝色背景 cv::Mat result = cv::Mat::zeros(src2.size(), src2.type()); result.setTo(cv::Scalar(0, 0, 255)); // 将蓝色背景与ROI融合 cv::Mat dst; bitwise_not(mask, mask); bitwise_or(result, result, dst, mask); add(dst, person, dst); imshow("dst", dst); cv::waitKey(0); }

浙公网安备 33010602011771号