1 说明:

=====

1.1 因各种需要,给图片打马赛克,当然本人着重介绍python用cv2的方法,主要讲解python和cv2的相关编程知识。

1.2 cv2模块:是OpenCV的python调用模块,本人有初步介绍,此处省略,可以看下面文章的链接:

https://www.toutiao.com/i6833713845005976067/

1.3 使用图片来源,下图,来源今日头条图库。

2 方法一,指定区域打马赛克:

======================

2.1 如何选定需要打马赛克的区域,即获取左上顶点的坐标x和y,还有马赛克宽和高:

2.2 先采用基本法zhao.py显示图片,代码:

#导入模块import cv2   #读取图像,指定路径和文件夹img = cv2.imread("/home/xgj/Desktop/OpenCV/kiss.jpeg")   #窗口标题名和挂在读取图片img显示cv2.imshow("Show Your Image", img)   #不支持中文标题名#默认为0,空值就是0,如果是非0,则就是动画,一张图没效果#cv2.waitKey (0)  cv2.waitKey () cv2.destroyAllWindows()

2.3 用上面显示图片法,找坐标,如下图:

2.4 记下需要马赛克区域的x和y坐标:

即左上顶点x和y是500,300

右下角x和y是600,450

所以得到:

#左上顶点坐标500,300(x,y),右下坐标600,450(x,y)#所以需要马赛克宽100,高150do_mosaic(im, 500, 300, 100, 150)   #指定马赛克区域

2.5 mosaic1.py完整代码:

#导出模块import cv2#自定义函数def do_mosaic(frame, x, y, w, h, neighbor=9):    """    :param frame: opencv frame    :param int x :  马赛克左顶点    :param int y:  马赛克右顶点    :param int w:  马赛克宽    :param int h:  马赛克高    :param int neighbor:  马赛克每一块的宽    """    #获取这张图片的h和w,并赋值给fh和fw    fh, fw = frame.shape[0], frame.shape[1]    #判断如果超过返回    if (y + h > fh) or (x + w > fw):        return    for i in range(0, h - neighbor, neighbor):  # 关键点0 减去neightbour 防止溢出        for j in range(0, w - neighbor, neighbor):            rect = [j + x, i + y, neighbor, neighbor]            color = frame[i + y][j + x].tolist()  # 关键点1 tolist            left_up = (rect[0], rect[1])            right_down = (rect[0] + neighbor - 1, rect[1] + neighbor - 1)  # 关键点2 减去一个像素            cv2.rectangle(frame, left_up, right_down, color, -1)#读取本地图片,1代表原色就是彩色im = cv2.imread('/home/xgj/Desktop/OpenCV/kiss.jpeg', 1)#左上顶点坐标500,300(x,y),右下坐标600,450(x,y)#所以需要马赛克宽100,高150do_mosaic(im, 500, 300, 100, 150)   #指定马赛克区域while 1:    k = cv2.waitKey(10)    if k == 27:#这是一个退出设置,27代表按esc按键        break    cv2.imshow('mosaic', im)#保存生成的mosaic的图片cv2.imwrite('/home/xgj/Desktop/OpenCV/kissmosaic.jpeg', im)

2.6 效果图

3 方法二:鼠标选定打马赛克法:

========================

3.1 mosaic2.py代码:

#coding:utf-8import cv2import numpy as np#定义初始化point_start = {'x':0,'y':0}point_end = {'x':0,'y':0}rows = 0cols = 0point_lft=0point_rgt=0selected = False#定义马赛克效果函数def mosaic(selected_image,nsize=9):    rows,cols,_ = selected_image.shape    dist = selected_image.copy()    # 划分小方块,每个小方块填充随机颜色    for y in range(0,rows,nsize):        for x in range(0,cols,nsize):            dist[y:y+nsize,x:x+nsize] = (np.random.randint(0,255),np.random.randint(0,255),np.random.randint(0,255))    return dist#定义鼠标操作,选定操作,注意点击按住鼠标左键,往下拖def mouse_handler(event,x,y,flag,params):    global point_lft,point_rgt,selected    if event == cv2.EVENT_LBUTTONDOWN:        print('button down')        point_start['x'] = x        point_start['y'] = y    if event == cv2.EVENT_LBUTTONUP:        print('button up')        point_end['x'] = x        point_end['y'] = y        selected = True#导入原图  src = cv2.imread('/home/xgj/Desktop/OpenCV/kiss.jpeg')#获取原图大小和像素rows,cols,_ = src.shapesrc_cpy = src.copy()#显示原图cv2.namedWindow("src")#在原图上调用鼠标操作cv2.setMouseCallback("src",mouse_handler)#如果鼠标没有选定while not selected:    cv2.imshow('src',src)    key = cv2.waitKey(10)# 处理选择的矩形rect = {}if point_start['x'] < point_end['x']:    rect['x'] = point_start['x']    rect['y'] = point_start['y']    rect['width'] = np.abs(point_end['x'] - point_start['x'])    rect['height'] = np.abs(point_end['y'] - point_start['y'])    cv2.rectangle(src,(point_start['x'],point_start['y']),(point_end['x'],point_end['y']),(255,0,0),3)else:    rect['x'] = point_end['x']    rect['y'] = point_end['y']    rect['width'] = np.abs(point_end['x'] - point_start['x'])    rect['height'] = np.abs(point_end['y'] - point_start['y'])    cv2.rectangle(src,(point_end['x'],point_end['y']),(point_start['x'],point_start['y']),(255,0,0),3)cv2.imshow('src',src)print('selected rect = ',rect)# 选择图像select_image = src_cpy[rect['y']:rect['y']+rect['height'],                    rect['x']:rect['x']+rect['height']]result = mosaic(select_image)# 将处理完成的区域合并回原图像src_cpy[rect['y']:rect['y']+rect['height'],        rect['x']:rect['x']+rect['height']] = cv2.addWeighted(result,0.65,select_image,0.35,2.0)#显示马赛克效果的图片cv2.imshow('result',src_cpy)#保存已经生成马赛克效果的图片和位置cv2.imwrite('/home/xgj/Desktop/OpenCV/kissmosaic2.jpeg', src_cpy)cv2.waitKey()cv2.destroyAllWindows()

3.2 效果图

自己整理并分享出来,喜欢的就点赞、转发和收藏。

cv2 python 多线程调用摄像头_2种方法用python调用cv2模块给图片打马赛克相关推荐

  1. python使用方法视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

  2. layui图片src 指定后没显示_2种方法用python调用cv2模块给图片打马赛克

    1 说明: ===== 1.1 因各种需要,给图片打马赛克,当然本人着重介绍python用cv2的方法,主要讲解python和cv2的相关编程知识. 1.2 cv2模块:是OpenCV的python调 ...

  3. python怎么导入视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

  4. python向上取整的方法_python 取整的两种方法,python向上取整的方法,问题简介:  要把一...

    python 取整的两种方法,python向上取整的方法,问题简介: 要把一 问题简介: 要把一个浮点数(float)整数部分提取出来.比如把"2.1"变成"2" ...

  5. python 字符串转函数名_Python 使用函数名(字符串)调用函数(4种方法)

    先看一个例子: >>> def foo(): print("foo") >>> def bar(): print("bar" ...

  6. python截图黑屏_对Python获取屏幕截图的4种方法详解

    Python获取电脑截图有多种方式,具体如下: PIL中的ImageGrab模块 windows API PyQt pyautogui PIL中的ImageGrab模块 import time imp ...

  7. WPF多线程UI更新——两种方法

    WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  8. Python 数据降噪处理的四种方法——均值滤波、小波变换、奇异值分解、改变binSize

    Python 数据降噪处理的四种方法--均值滤波.小波变换.奇异值分解.改变binSize github主页:https://github.com/Taot-chen 一.均值滤波 1)算法思想 给定 ...

  9. 【Qt】Qt多线程开发—实现多线程设计的四种方法

    Qt-使用Qt实现多线程设计的四种方法 文章目录 Qt-使用Qt实现多线程设计的四种方法 一.写在前面 二.[方法一] QThread:带有可选事件循环的底层API 三.[方法二] QThreadPo ...

最新文章

  1. QCopChannel的用法
  2. 转盘抽奖(主要:概率和JQ)
  3. JGroups:无需额外基础架构的领导人选举
  4. python 递归函数例子_python函数递归的几个例子
  5. rabbitmq direct 多个消费者_RabbitMQ从零开始
  6. 关于cmd如何进出文件夹
  7. 企业全面运营管理沙盘模拟心得_大庆职业学院举办创业技能大赛企业经营管理沙盘模拟赛...
  8. vb 字符串和数字相互转换函数
  9. MATLAB--二分法
  10. 怎么把英文字幕翻译成中文?快把这些方法收好
  11. matlab求解非线性方程数值解,[转载]MATLAB求解非线性方程(转)
  12. 关于win10微软商店打不开的99%解决办法
  13. 迪赛智慧数——其他图表(平行坐标图):2001 VS 2020主要城市房价及涨幅
  14. MySQL 完全备份 + 增量备份+完全恢复
  15. matlab经纬度画轨迹图_MATLAB将经纬度坐标转换成直角坐标
  16. Android学习 - Material Design设计规范
  17. uploadify多个文件上传,提示超过最多限制
  18. 什么是超大规模数据中心?它们是如何工作的?
  19. 音频编解码基础知识(一)
  20. 算法——股票买卖问题

热门文章

  1. favicon.ico在ie下面不显示的解决方法
  2. 解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
  3. Android Fragment手柄后退按钮按下[重复]
  4. php cookie防伪造,技术分享:Cookie 防伪造 防修改
  5. get,post网络请求
  6. java windows wrapper_Java Service Wrapper 发布Java程序为Windows服务
  7. caged系统pdf_热电材料的应用和研究进展.pdf
  8. centos7火狐浏览器上不了网_网络问题备忘:能ping通,就是上不了网
  9. 普通话测试第四题评分标准_2017年普通话考试-评分细则
  10. vue中watch监听路由传来的参数变化