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)相关推荐

  1. OpenCV蒙版的使用实例(2)

    本文用蒙版实现含透明通道的png文件的保存. 要保存透明通道图像必须有四通道,这里alpha通道值由蒙版提供,下列函数由一个图像和用作alpha的蒙版合成另一个包含alpha通道的图像,我们在蒙版上擦 ...

  2. OpenCV蒙版图像make mask image的实例(附完整代码)

    OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 OpenCV蒙版图像make mask image的实例 #include &quo ...

  3. OpenCV SURF检测的实例(附完整代码)

    OpenCV SURF检测的实例 OpenCV SURF检测的实例 OpenCV SURF检测的实例 #include <iostream> #include "opencv2/ ...

  4. OpenCV使用pointPolygonTest的实例(附完整代码)

    OpenCV使用pointPolygonTest的实例 OpenCV使用pointPolygonTest的实例 OpenCV使用pointPolygonTest的实例 #include "o ...

  5. OpenCV形态morphology的实例(附完整代码)

    OpenCV形态morphology的实例 OpenCV形态morphology的实例 OpenCV形态morphology的实例 #include "opencv2/imgproc.hpp ...

  6. OpenCV图像操作的实例(附完整代码)

    OpenCV图像操作的实例 OpenCV图像操作的实例 OpenCV图像操作的实例 #include "opencv2/core.hpp" #include "openc ...

  7. OpenCV支持向量机SVM的实例(附完整代码)

    OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...

  8. OpenCV将GIS数据加载到OpenCV容器中的实例(附完整代码)

    OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 OpenCV将GIS数据加载到OpenCV容器中的实例 #include "o ...

  9. OpenCV显示图片的实例(附完整代码)

    OpenCV显示图片的实例 OpenCV显示图片的实例 OpenCV显示图片的实例 #include <opencv2/core.hpp> #include <opencv2/img ...

  10. OpenCV兼容性测试的实例(附完整代码)

    OpenCV兼容性测试的实例 OpenCV兼容性测试的实例 OpenCV兼容性测试的实例 #include <iostream> #include <opencv2/core.hpp ...

最新文章

  1. DinnerNow - 如何安装部署
  2. openface 和openpose(pytorch)剪枝之路
  3. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器
  4. boost::histogram::detail::tuple_slice用法的测试程序
  5. SDNU 1178.能量项链(区间dp)
  6. IE下iframe跨域session和cookie失效问题的解决方案
  7. ajax局部刷新_web前端入门到实战:实现html页面自动刷新
  8. 四格漫画《MUXing》——度姐传说
  9. 自定义标签 —— 实现时间转换和输出功能
  10. 前端学习(3047):vue+element今日头条管理-使用table表格组件
  11. iphone屏蔽系统更新_手贱更新了 iphone系统,想退回到原来的版本,这个方法简单易用...
  12. 什么题材的短视频最吸引人观看?
  13. Asp.net MVC4 下二级联动
  14. javascript 正则表达式学习
  15. 2022-2028全球浴室地漏行业调研及趋势分析报告
  16. 下载哔哩哔哩代码php,哔哩哔哩电脑客户端 v1.4.4 官方最新版
  17. vue 版的老虎机抽奖活动效果折腾小记
  18. PIBOT移植ROS2记录(2)-添加Node与cmd_vel
  19. gimtehseet工时管理系统介绍
  20. 【毕业设计_课程设计】基于移动设备的眼球追踪技术及其应用(源码+论文)

热门文章

  1. php创建一个文本计数器,一个用php编写的简单计数器,php编写简单计数器_PHP教程...
  2. mybatis plus table doesn't exists
  3. 软件测试面试如何正确谈论薪资?
  4. 【Python】24点 一行代码解决
  5. 2022阿里巴巴云栖大会
  6. 专科计算机专业取消,教育部公布已撤销了这些大学专业!有你的专业吗
  7. 游戏策划——游戏的分类
  8. 计算机学报在线阅读,ei收录的计算机类核心源:计算机研究与发展计算机学报软件.doc...
  9. 纯代码方式实现cesium倾斜摄影单体化和楼栋分层
  10. SAP 生产成本明细报表