用OpenCV自带的inpaint()演示

CV_EXPORTS_W void inpaint(
InputArray src,
InputArray inpaintMask,
OutputArray dst,
double inpaintRadius,
int flags
);
  • src 输入图像
  • inpaintMask 掩膜,和输入矩阵相同size的黑白矩阵。白色表示感兴趣区域。这里指需要修复的区域。
  • dst 输出图像
  • inpaintRadius 是渲染半径,一般用小半径3,大半径容易模糊。
  • flags 修复方法,有两种:INPAINT_NS 和 INPAINT_TELEA。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("images/favorite/cat.jpg");
Mat dst; Rect rect0(624, 655, 400, 20);//这里的参数是我手动修改凑出来的 Mat mask = Mat::zeros(src.size(), CV_8UC1);
mask(rect0).setTo(255); inpaint(src, mask, dst, 3, INPAINT_NS); imshow("mask", mask);
imshow("src", src);
imshow("dst", dst); waitKey(0);
return 0;
}

画图程序

创建鼠标回调函数

CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
#include <opencv2/opencv.hpp>

using namespace cv;

Mat mask_board;
int width = 5;
int paint_or_wipe = 1; void draw_dot(int event, int x, int y, int flags, void *ustc)
{
Scalar color;
if(paint_or_wipe)
color = (255);
else
color = (0);
if(event == EVENT_LBUTTONDOWN)
rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
if(event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON)
rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
} int main()
{
Mat src = imread("images/favorite/cat.jpg");
mask_board = Mat::zeros(src.size(), CV_8UC1); imshow("mask_board", mask_board);
setMouseCallback("mask_board", draw_dot);
int k = 1;
createTrackbar("paint_or_wipe", "mask_board", &k, 1); while (1)
{
paint_or_wipe = k; imshow("mask_board", mask_board); if(waitKey(1) == 'q')
break;
} return 0;
}

做一个去除水印小工具

利用OpenCV自带的highgui来做一个小应用,支持用鼠标划出水印位置,然后除水印。

#include <opencv2/opencv.hpp>

using namespace cv;

Mat mask_board;
const int width = 7;
int paint_or_wipe = 1;
int show = 1; void draw_dot(int event, int x, int y, int flags, void *ustc)
{
Scalar color;
if(paint_or_wipe)
color = (255);
else
color = (0);
if(event == EVENT_LBUTTONDOWN or (event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON))
rectangle(mask_board, Point(x - width / 2, y - width / 2), Point(x + width / 2, y + width / 2), color, -1); } int main()
{
Mat src = imread("images/favorite/my.jpg");
Mat dst;
mask_board = Mat(src.size(), CV_8UC1, Scalar(0)); imshow("image", src);
setMouseCallback("image", draw_dot);
createTrackbar("paint_or_wipe", "image", &paint_or_wipe, 1);
createTrackbar("show", "image", &show, 1); while (1)
{
if(waitKey(1) == 'q')
break; inpaint(src, mask_board, dst, 3, INPAINT_NS);
if(!show)
bitwise_and(src, Scalar(0, 0, 0), dst, mask_board); imshow("image", dst);
} waitKey(0);
return 0;
}

(完)

最新文章

  1. web 开发自动化grunt
  2. jQuery缓存数据
  3. Shell if else语句
  4. css背景图片位置:background的position
  5. struts2 OGNL 表达式
  6. easyui tree 判断点击的节点是否还存在子节点
  7. C# 图片压缩 开源库
  8. hdu_5879_Cure(打表)
  9. 提高 webpack 构建 Vue 项目的速度
  10. Could not establish trust relationship for the SSL/TLS secure channel 问题解决方法
  11. H5-html基础
  12. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
  13. Spring 基础知识(一)基本概念 DI、IOC、AOP
  14. AOP缓存实现
  15. linux 几个命令
  16. vue.JS 介绍
  17. Centos7,配置防火墙,开启端口
  18. ucore-lab1-练习1report
  19. __new__[转载]
  20. poj2679

热门文章

  1. C#调用Bartender打印
  2. redis实战笔记
  3. patch 28729262
  4. LeetCode 9. Palindrome Number(c语言版)
  5. RCNN论文学习
  6. 如何选择 Apache Tomcat 与 JDK 版本
  7. jQuery时间轴插件timeline.js
  8. js replace替换字符串,同时替换多个方法
  9. nginx 10054报错问题解决方案
  10. 用html给div加类似a标签的超链接(转)