OpenCV蒙版的使用实例(1)
cv::Mat的方法CopyTo第二个参数是一个蒙版,该蒙版的长宽必须与源矩阵一致,某一像素点的蒙版值不为0就会复制到目标矩阵,应用于图像时可利用蒙版只复制部分像素从而生成各种特殊效果。
本文用到的原图
1、只显示鼠标附近的图像
就像从小孔看外面的效果,只要在蒙版上画一个圆,并将圆内填充为白色(circle函数的线宽设置为-1就可以填充圆),然后调用CopyTo就可以了
#include<opencv2/opencv.hpp>
cv::Mat backgroundImg;
cv::Mat resultImg;
cv::Mat foregroundImg;
cv::Mat maskImg;
const char* winName = "Image";
void OnMouseEvent(int event, int x, int y, int flags, void* userdata)
{if (event == cv::EVENT_MOUSEMOVE){foregroundImg.copyTo(resultImg);//将前景色复制到resultImgmemset(maskImg.data, 0, maskImg.cols * maskImg.rows * maskImg.elemSize());//将蒙版重置为全0cv::circle(maskImg, cv::Point(x, y), 100, cv::Scalar::all(255), -1);//在蒙版上绘制一个半径为100的圆backgroundImg.copyTo(resultImg, maskImg);//通过蒙版将背景图片复制到resultimgcv::imshow(winName, resultImg);}
}
int main(int argc, char** arv)
{backgroundImg = cv::imread("../Resources/Images/test3.jpg");//背景图片foregroundImg = cv::Mat::zeros(backgroundImg.size(), backgroundImg.type());//前景图片为全黑色foregroundImg.copyTo(resultImg);maskImg = cv::Mat::zeros(backgroundImg.size(), CV_8U);//蒙版全0cv::namedWindow(winName);cv::imshow(winName, resultImg);cv::setMouseCallback(winName, OnMouseEvent);cv::waitKey(0);return 0;
}
这里用了4矩阵,backgroundImg为要显示的图片,foregroundImg为前景色,这里设置为全黑色,maskImg是蒙版,resultImg为最终看到的图片,鼠标每次移动都要将蒙版清0,不然已经显示的图片不会被黑色覆盖,最终效果如下。
2、擦玻璃的效果
上面在鼠标移动的时候会将蒙版清0,如果不清0被划过的地方就会一直显示,这里就是不清0来实现擦除玻璃上雾气的效果,前景色换成背景图片的模糊效果,并且将上面鼠标移动事件改到鼠标按下并移动时触发
#include<opencv2/opencv.hpp>
cv::Mat backgroundImg;
cv::Mat resultImg;
cv::Mat foregroundImg;
cv::Mat maskImg;
const char* winName = "Image";
void OnMouseEvent(int event, int x, int y, int flags, void* userdata)
{static bool bMouseDown = false;if (event == cv::EVENT_LBUTTONDOWN){bMouseDown = true;}else if (event == cv::EVENT_LBUTTONUP){bMouseDown = false;}else if (event == cv::EVENT_MOUSEMOVE){if (bMouseDown){foregroundImg.copyTo(resultImg);cv::circle(maskImg, cv::Point(x, y), 20, cv::Scalar::all(255), -1);backgroundImg.copyTo(resultImg, maskImg);cv::imshow(winName, resultImg);}}
}
int main(int argc, char** arv)
{backgroundImg = cv::imread("../Resources/Images/test3.jpg");cv::blur(backgroundImg, foregroundImg, cv::Size(20, 20));//将backgroundImg模糊并赋给foregroundImgforegroundImg.copyTo(resultImg);maskImg = cv::Mat::zeros(backgroundImg.size(), CV_8U);cv::namedWindow(winName);cv::imshow(winName, resultImg);cv::setMouseCallback(winName, OnMouseEvent);cv::waitKey(0);return 0;
}
鼠标按下并移动的时候划过的地方就会显示清晰的图像,就像刮奖一样,效果如下
上面的圆形可以换成任意形状,OpenCV的图形绘制函数都可以或者使用drawContours画出形状轮廓。
OpenCV蒙版的使用实例(1)相关推荐
- OpenCV蒙版的使用实例(2)
本文用蒙版实现含透明通道的png文件的保存. 要保存透明通道图像必须有四通道,这里alpha通道值由蒙版提供,下列函数由一个图像和用作alpha的蒙版合成另一个包含alpha通道的图像,我们在蒙版上擦 ...
- OpenCV蒙版图像make mask image的实例(附完整代码)
OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 #include &quo ...
- OpenCV SURF检测的实例(附完整代码)
OpenCV SURF检测的实例 OpenCV SURF检测的实例 OpenCV SURF检测的实例 #include <iostream> #include "opencv2/ ...
- OpenCV使用pointPolygonTest的实例(附完整代码)
OpenCV使用pointPolygonTest的实例 OpenCV使用pointPolygonTest的实例 OpenCV使用pointPolygonTest的实例 #include "o ...
- OpenCV形态morphology的实例(附完整代码)
OpenCV形态morphology的实例 OpenCV形态morphology的实例 OpenCV形态morphology的实例 #include "opencv2/imgproc.hpp ...
- OpenCV图像操作的实例(附完整代码)
OpenCV图像操作的实例 OpenCV图像操作的实例 OpenCV图像操作的实例 #include "opencv2/core.hpp" #include "openc ...
- OpenCV支持向量机SVM的实例(附完整代码)
OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...
- OpenCV将GIS数据加载到OpenCV容器中的实例(附完整代码)
OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 #include "o ...
- OpenCV显示图片的实例(附完整代码)
OpenCV显示图片的实例 OpenCV显示图片的实例 OpenCV显示图片的实例 #include <opencv2/core.hpp> #include <opencv2/img ...
- OpenCV兼容性测试的实例(附完整代码)
OpenCV兼容性测试的实例 OpenCV兼容性测试的实例 OpenCV兼容性测试的实例 #include <iostream> #include <opencv2/core.hpp ...
最新文章
- DinnerNow - 如何安装部署
- openface 和openpose(pytorch)剪枝之路
- 揭秘阿里中台!一文看懂阿里推荐业务的两大利器
- boost::histogram::detail::tuple_slice用法的测试程序
- SDNU 1178.能量项链(区间dp)
- IE下iframe跨域session和cookie失效问题的解决方案
- ajax局部刷新_web前端入门到实战:实现html页面自动刷新
- 四格漫画《MUXing》——度姐传说
- 自定义标签 —— 实现时间转换和输出功能
- 前端学习(3047):vue+element今日头条管理-使用table表格组件
- iphone屏蔽系统更新_手贱更新了 iphone系统,想退回到原来的版本,这个方法简单易用...
- 什么题材的短视频最吸引人观看?
- Asp.net MVC4 下二级联动
- javascript 正则表达式学习
- 2022-2028全球浴室地漏行业调研及趋势分析报告
- 下载哔哩哔哩代码php,哔哩哔哩电脑客户端 v1.4.4 官方最新版
- vue 版的老虎机抽奖活动效果折腾小记
- PIBOT移植ROS2记录(2)-添加Node与cmd_vel
- gimtehseet工时管理系统介绍
- 【毕业设计_课程设计】基于移动设备的眼球追踪技术及其应用(源码+论文)
热门文章
- php创建一个文本计数器,一个用php编写的简单计数器,php编写简单计数器_PHP教程...
- mybatis plus table doesn't exists
- 软件测试面试如何正确谈论薪资?
- 【Python】24点 一行代码解决
- 2022阿里巴巴云栖大会
- 专科计算机专业取消,教育部公布已撤销了这些大学专业!有你的专业吗
- 游戏策划——游戏的分类
- 计算机学报在线阅读,ei收录的计算机类核心源:计算机研究与发展计算机学报软件.doc...
- 纯代码方式实现cesium倾斜摄影单体化和楼栋分层
- SAP 生产成本明细报表