【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);
}
复制代码

 

posted @   0MrMKG  阅读(181)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示