OpenCV实现马赛克功能

本文实例为大家分享了OpenCV实现马赛克功能的具体代码,供大家参考,具体内容如下

实现用按下鼠标左键拖动时,在鼠标经过的路径上打上马赛克。

马赛克的原理是将图像中选中区域的像素用这个选中区域中的某一像素覆盖。

为了不让鼠标重复经过图像中同一个的时候,选取不一样的像素,该程序将在输入图片的时候,就实现了全图的马赛克效果。而当鼠标划过的时候,程序只是将实现马赛克的图片的指定位置复制到显示的图像中。

效果类似于QQ截图中的马赛克。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream> 

using namespace cv;
using namespace std; 

Mat inputImage;
Mat inputImage_mosaic;
Mat inputImage_clone; 

//马赛克的大小
int neightbourhood = 20; 

//记录鼠标的状态,0为鼠标左键未按下或弹起,1为鼠标左键按下
int mouseStatus = 0; 

void onMouse(int events, int x, int y, int flag, void* ustg); 

//创建马赛克图片
void createMosaicImage(Mat inputMat, Mat& outputMat, int size); 

//设置马赛克区域
void setMosaic(Mat& inputMat, Rect rect); 

int main(void){
 inputImage = imread("test2.jpg");
 inputImage_clone = inputImage.clone();
 createMosaicImage(inputImage, inputImage_mosaic, neightbourhood); 

 namedWindow("showImage", 0);
 setMouseCallback("showImage", onMouse); 

 waitKey();
 return 0;
} 

void createMosaicImage(Mat inputMat, Mat& outputMat, int size){
 RNG rng;
 int height = inputMat.rows;
 int width = inputMat.cols;
 Mat padding;
 Mat tempMat; 

 //为了方便后面的计算,将输入的图像大小扩充到宽高都是size的倍数
 copyMakeBorder(inputMat, padding, 0, size - inputMat.rows % size, 0, size - inputMat.cols % size, BORDER_REPLICATE);
 tempMat = padding.clone(); 

 for (int row = 0; row < padding.rows; row += size){
 for (int col = 0; col < padding.cols; col += size){
  int rand_x = rng.uniform(0, size);
  int rand_y = rng.uniform(0, size);
  Rect rect = Rect(col, row, size, size);
  Mat roi = tempMat(rect);
  Scalar color = Scalar(padding.at<Vec3b>(row + rand_y, col + rand_x)[0], \
  padding.at<Vec3b>(row + rand_y, col + rand_x)[1], \
  padding.at<Vec3b>(row + rand_y, col + rand_x)[2]);
  roi.setTo(color);
 }
 }
 outputMat = tempMat(Rect(0, 0, width, height)).clone();
} 

void setMosaic(Mat& inputMat, Rect rect){
 Mat roi = inputMat(rect);
 Mat tempRoi = inputImage_mosaic(rect);
 tempRoi.copyTo(roi);
} 

void onMouse(int events, int x, int y, int flag, void* ustg){ 

 //当鼠标移除图片区域的时候,不做操作
 if (x < 0 || x > inputImage.cols || y < 0 || y > inputImage.rows){
 return;
 } 

 //马赛克块的位置信息
 int x_left, x_right, y_top, y_bottom;
 x - neightbourhood <= 0 ? x_left = 0 : x_left = x - neightbourhood;
 x + neightbourhood > inputImage.cols ? x_right = inputImage.cols: x_right = x + neightbourhood;
 y - neightbourhood <= 0 ? y_top = 0 : y_top = y - neightbourhood;
 y + neightbourhood > inputImage.rows ? y_bottom = inputImage.rows: y_bottom = y + neightbourhood; 

 if (events == CV_EVENT_LBUTTONDOWN){
 mouseStatus = 1;
 setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
 }
 else if (events == CV_EVENT_MOUSEMOVE){
 if (mouseStatus == 1){
  setMosaic(inputImage_clone, Rect(x_left, y_top, x_right - x_left, y_bottom - y_top));
 }
 else{
  //nothing
 }
 }
 else if (events == CV_EVENT_LBUTTONUP){
 mouseStatus = 0;
 }
 else {
 //cout << "nothing" << endl;
 }
 imshow("showImage", inputImage_clone);
}

效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • OpenCV实现马赛克和毛玻璃滤镜效果
(0)

相关推荐

  • OpenCV实现马赛克和毛玻璃滤镜效果

    本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考,具体内容如下 一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框. #include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; Mat i

  • OpenCV实现马赛克功能

    本文实例为大家分享了OpenCV实现马赛克功能的具体代码,供大家参考,具体内容如下 实现用按下鼠标左键拖动时,在鼠标经过的路径上打上马赛克. 马赛克的原理是将图像中选中区域的像素用这个选中区域中的某一像素覆盖. 为了不让鼠标重复经过图像中同一个的时候,选取不一样的像素,该程序将在输入图片的时候,就实现了全图的马赛克效果.而当鼠标划过的时候,程序只是将实现马赛克的图片的指定位置复制到显示的图像中. 效果类似于QQ截图中的马赛克. #include <opencv2\core\core.hpp>

  • OpenCV实现马赛克和毛玻璃滤镜特效

    本文实例为大家分享了OpenCV实现马赛克和毛玻璃滤镜特效的具体代码,供大家参考,具体内容如下 一.马赛克效果 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓. 以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框. 代码: #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #

  • python使用opencv实现马赛克效果示例

    本文实例讲述了python使用opencv实现马赛克效果.分享给大家供大家参考,具体如下: 最近要实现opencv视频打马赛克,在网上找了一下基本是C++的实现,好在原理一样,下面给出python实现. 原理和注意点,我都写在注释里了 import cv2 ##马赛克 def do_mosaic(frame, x, y, w, h, neighbor=9): """ 马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内左上像素点的颜色代替,这样可以模糊细节,但是

  • TensorFlow2.X结合OpenCV 实现手势识别功能

    使用Tensorflow 构建卷积神经网络,训练手势识别模型,使用opencv DNN 模块加载模型实时手势识别 效果如下: 先显示下部分数据集图片(0到9的表示,感觉很怪) 构建模型进行训练 数据集地址 import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets,layers,optimizers,Sequential,metrics from tensorflow.pyt

  • Opencv实现画笔功能

    本文实例为大家分享了Opencv实现画笔功能的具体代码,供大家参考,具体内容如下 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Rect g_rectangle; bool g_bDrawing = false; RNG g_rng(12345); Point g_nCurrPoint; int g_nThick = 0, g_nBlue = 255,

  • Python+Opencv实现图像匹配功能(模板匹配)

    本文实例为大家分享了Python+Opencv实现图像匹配功能的具体代码,供大家参考,具体内容如下 1.原理 简单来说,模板匹配就是拿一个模板(图片)在目标图片上依次滑动,每次计算模板与模板下方的子图的相似度,最后就计算出了非常多的相似度: 如果只是单个目标的匹配,那只需要取相似度最大值所在的位置就可以得出匹配位置: 如果要匹配多个目标,那就设定一个阈值,就是说,只要相似度大于比如0.8,就认为是要匹配的目标. 1.1 相似度度量指标 差值平方和匹配 CV_TM_SQDIFF 标准化差值平方和匹

  • OpenCv实现绘图功能

    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotlib.pyplot as plt import cv2 #画图 def show(image): plt.imshow(image) plt.axis('off') plt.show() image = np.zeros((300,300,3),dtype='uint8') #画线 green = (0,255,0) cv

  • 利用Java+OpenCV实现拍照功能

    由于项目需要拍照,看了好多的资料不是C语言的就是python,开始用的JavaCv但是有好多问题,所以改成了OpenCv 只能硬着上了,查了好的网上的资料,终于找到了 依赖jar包:只有一个OpenCv的jar包,可以直接从官网上下载 下面上代码 import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.Buffered

  • OpenCV绘制图形功能

    本文实例为大家分享了OpenCV绘制图形功能的具体代码,供大家参考,具体内容如下 1.绘制直线 绘制直线函数是cv::line,函数完整形式如下 void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); /* @param img 图像 @param pt1 线段端点1 @param pt2

随机推荐