文章目录

  • 前言
  • 一、Mask
  • 二、彩色直方图
  • 三、画出基本图形
  • 四、图片上显示文本
  • 五、人脸检测

前言

本文为9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测,分为五个章节:

  • Mask;
  • 彩色直方图;
  • 画出基本图形;
  • 图片上显示文本;
  • 人脸检测。

一、Mask

提取感兴趣的区域。

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np# 方法:显示图片
def show_image(image, title, pos):img_RGB = image[:, :, ::-1] # BGR to RGBplt.title(title)plt.subplot(2, 2, pos)plt.imshow(img_RGB)# 方法:显示灰度直方图
def show_histogram(hist, title, pos, color):plt.subplot(2, 2, pos)plt.title(title)plt.xlim([0, 256])plt.plot(hist, color=color)# 主函数
def main():# 创建一个画布plt.figure(figsize=(12, 7))plt.suptitle("Gray Image and Histogram with mask", fontsize=14, fontweight="bold")# 加载图片并转成灰度,计算直方图、显示img_gray = cv.imread("images/vonmises.png", cv.COLOR_BGR2GRAY)img_gray_hist = cv.calcHist([img_gray], [0], None, [256], [0, 256]) # 计算直方图show_image(img_gray, "image gray", 1)show_histogram(img_gray_hist, "image gray histogram", 2, "m")# 创建 mask,计算位图,直方图mask = np.zeros(img_gray.shape[:2], np.uint8)mask[130:500, 300:700] = 255 # 获取 mask,并赋予颜色img_mask_hist = cv.calcHist([img_gray], [0], mask, [256], [0, 256]) # 计算 mask 直方图# 通过与运算计算带有 mask 的灰度图片mask_img = cv.bitwise_and(img_gray, img_gray, mask=mask)# 显示带有 mask 的图片和直方图show_image(mask_img, "gray image with mask", 3)show_histogram(img_mask_hist, "histogram with masked gray image", 4, "m")plt.show()if __name__ == '__main__':main()


二、彩色直方图

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np# 方法:显示图片
def show_image(image, title, pos):plt.subplot(3, 2, pos)plt.title(title)image_RGB = image[:, :, ::-1] # BGR to RGBplt.imshow(image_RGB)plt.axis("off")# 方法:显示彩色直方图
def show_histogram(hist, title, pos, color):plt.subplot(3, 2, pos)plt.title(title)plt.xlim([0, 256])for h, c in zip(hist, color):  # color: ('b', 'g', 'r')plt.plot(h, color=c)# 方法:计算直方图
def calc_color_hist(image):# b, g, rhist = []color = ('b', 'g', 'r')# print(tuple(enumerate(color)))for i, _ in enumerate(color):  # list(enumerate) ==> [(0, 'b'), (1, 'g'), (2, 'r')]hist.append(cv.calcHist([image], [i], None, [256], [0, 256]))return hist# 主函数
def main():# 创建画布plt.figure(figsize=(12, 8))plt.suptitle("Color Histogram", fontsize=14, fontweight="bold")# 读取原图片img = cv.imread("./images/vonmises.png")# 计算直方图img_hist = calc_color_hist(img)# 显示图片和直方图show_image(img, "RGB Image", 1)show_histogram(img_hist, "RGB Image Hist", 2, ('b', 'g', 'r'))# 原始图片中的每个像素增加 50个像素值M = np.ones(img.shape, dtype="uint8") * 50added_image = cv.add(img, M)added_image_hist = calc_color_hist(added_image)show_image(added_image, "Added Image", 3)show_histogram(added_image_hist, "Added Image Hist", 4, ('b', 'g', 'r'))# 原始图片中的每个像素减少 50个像素值subtracted_img = cv.subtract(img, M)subtracted_img_hist = calc_color_hist(subtracted_img)show_histogram(subtracted_img, "Subtracted Image", 5, ('b', 'g', 'r'))show_histogram(subtracted_img_hist, "Subtracted Image Hist", 6, ('b', 'g', 'r'))plt.show()if __name__ == '__main__':main()


三、画出基本图形

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 定义颜色(字典形式)
colors = {'blue': (255, 0, 0),'green': (0, 255, 0),'red': (0, 0, 255),'yellow': (0, 255, 255),'magenta': (255, 0, 255),'cyan': (255, 255, 0),'white': (255, 255, 255),'black': (0, 0, 0),'gray': (125, 125, 125),'rand': np.random.randint(0, high=256, size=(3, )).tolist(),'dark_gray': (50, 50, 50),'light_gray': (220, 220, 220)}# 方法:显示图片
def show_image(image, title):img_RGB = image[:, :, ::-1]  # BGR to RGBplt.title(title)plt.imshow(img_RGB)plt.show()
  1. 画直线, cv2.line( ):
# 创建画布
canvas = np.zeros((400, 400, 3), np.uint8)  # 默认背景是黑色
canvas[:] = colors["white"]
show_image(canvas, "Background")# 画直线 cv.line()
cv.line(canvas, (0, 0), (400, 400), colors['green'], 5)
cv.line(canvas, (0, 400), (400, 0), colors['black'], 5)
show_image(canvas, "cv.line()")

  1. 画长方形,cv2.rectangle( )
cv.rectangle(canvas, (10, 20), (70, 120), colors['green'], 3)
cv.rectangle(canvas, (150, 50), (200, 300), colors['blue'], -1)  # -1: 填充
show_image(canvas, "cv.rectangle()")

  1. 画圆型,cv2.circle( )
cv.circle(canvas, (200, 200), 150, colors["black"], 3)
cv.circle(canvas, (200, 200), 50, colors["green"], -1)
show_image(canvas, "cv.circle()")

  1. 画折线,cv2.polylines( )
pts = np.array([[250, 5], [220, 80], [280, 80]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(canvas, [pts], True, colors["green"], 3)pts2 = np.array([[150, 200], [90, 130], [280, 180]], np.int32)
pts2 = pts2.reshape([-1, 1, 2])
cv.polylines(canvas, [pts2], False, colors['black'], 5)
show_image(canvas, "cv.polylines")


四、图片上显示文本

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 定义颜色(字典形式)
colors = {'blue': (255, 0, 0),'green': (0, 255, 0),'red': (0, 0, 255),'yellow': (0, 255, 255),'magenta': (255, 0, 255),'cyan': (255, 255, 0),'white': (255, 255, 255),'black': (0, 0, 0),'gray': (125, 125, 125),'rand': np.random.randint(0, high=256, size=(3, )).tolist(),'dark_gray': (50, 50, 50),'light_gray': (220, 220, 220)}# 方法:显示图片
def show_image(image, title):img_RGB = image[:, :, ::-1]  # BGR to RGBplt.title(title)plt.imshow(img_RGB)plt.show()# 创建画布
canvas = np.zeros((400, 400, 3), np.uint8) # 默认背景是黑色
canvas.fill(255) # canvas[:] = colors[""]# 往画布上输入文本
cv.putText(canvas, "Hello World", (50, 50), cv.FONT_HERSHEY_SIMPLEX, 0.9, colors["red"], cv.LINE_4)show_image(canvas, "Canvas")


五、人脸检测

  • 目标: 确定人脸位置,画出矩形框。

  • 原理: 使用 Haar-like 特征做检测:特征值为白色矩形像素和减去黑色矩形像素和。

    • Integral Image:积分图加速特征计算;
    • AdaBoost : 选择关键特征,进行人脸和非人脸分类;
    • Cascade : 级联,弱分类器成为强分类器。
    • 四个级联分类器(针对人脸的正面):
      1. haarcascade_frontalface_alt.xml (FA1);
      2. haarcascade_frontalface_alt2.xml (FA2);
      3. haarcascade_frontalface_alt_tree.xml (FAT);
      4. haarcascade_frontalface_default.xml (FD)。
import cv2 as cv# 方法:绘制图片中检测到的人脸
def plot_rectangle(image, faces):# 拿到检测到的人脸数据(4个值):坐标(x, y), width, heightfor (x, y, w, h) in faces:cv.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 3)return image# 主函数
def main():# 读取摄像头capture = cv.VideoCapture(0)# 通过 cv.CascadeClassifier() 加载级联分类器faces_alt2 = cv.CascadeClassifier("haarcascade_frontalface_alt2.xml")# 判断摄像头是否正常工作if capture.isOpened() is False:print("Camera Error !")while capture.isOpened():# 获取每一帧ret, frame = capture.read()print(ret)if ret:gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 使用该分类器对图像中的人脸进行检测faces_alt2_detect = faces_alt2.detectMultiScale(gray)# 绘制图片中检测到的人脸faces_alt2_result = plot_rectangle(frame.copy(), faces_alt2_detect)cv.imshow("Face Detection", faces_alt2_result)if cv.waitKey(20) & 0xFF == ord("q"):breakelse:breakcapture.release()cv.destroyAllWindows()if __name__ == '__main__':main()


9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测相关推荐

  1. 4月10日下午学习日志

       2017年4月10日下午复习了高等数学,继续看了张宇高等数学基础班课程视频第四讲考研数学的基本定理串讲十大基本理论综述及其例题讲解,在此过程中能巩固之前所学内容,不懂的问题得以解决,印象也更加深 ...

  2. opencv学习笔记21:直方图和掩膜 原理及其应用

    直方图概念 如图:下面黑色图为上面图的直方图 横坐标:图像中各个像素点的灰度级 纵坐标:具有该灰度级的像素个数. 归一化直方图 横坐标:图像中各个像素点的灰度级 纵坐标:出现该灰度级的概率. DIMS ...

  3. OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度

    转自 终于到了有实际应用的功能了,有2张图片,里面各有一个人脸,我的目的是比较这两个人脸的相似度,这里用到了facedetect的功能,还有图像转换,图像剪切,以及直方图的比较.具体流程是: 1.分别 ...

  4. K210学习笔记(八)——人脸检测和人脸识别

    前言 人脸检测是人脸识别算法的第一步,人脸识别过程主要分为人脸图像获取.人脸检测.人脸配准.人脸表征以及人脸图像匹配与识别.人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形(椭 ...

  5. 2015年10月22日CSS学习笔记

    XHTML1.0对HTML4.0的改进 借鉴了XML的写法,语法更加严格. 把页面的内容和样式分离了,废弃了html4中的表示样式的标签和属性.推荐使用css来描述页面的样式. CSS样式的优先级 ! ...

  6. Jerry 2016年5月20日到5月23日的学习笔记

    研究了Query view的数据读取逻辑,学习了针对一个复杂的scenario,如何通过自己开发一个简单的report + SAT的方式, 来自己debug 取数逻辑.通过这个练习,加深了CDS里qu ...

  7. python dict hash算法_2020年3月26日python学习笔记——hash

    什么是哈希? hash,一般翻译做散列.杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列 ...

  8. 银角大王 python_2020年3月14日python学习笔记——练习题(第二章)——————重要...

    练习 针对列表names=['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva','鸡头']进入以下操作 1.通过names.index()的方法返回第2 ...

  9. 6月9日 js学习笔记

    对象 对象也是变量.但是对象包含很多值. JavaScript 对象是被命名值的容器. (JavaScript 对象中的)名称:值 被称为属性. var person = {firstName:&qu ...

最新文章

  1. ubuntu12.04 alternate win7 双系统安装
  2. 如果修改postgresql的最大连接数
  3. POJ 1691 Painting A Board
  4. ML之LiRDNNEL:基于skflow的LiR、DNN、sklearn的RF对Boston(波士顿房价)数据集进行回归预测(房价)
  5. 你的 GitHub 代码已打包运往北极,传给 1000 年后人类
  6. U启动安装原版Win7系统教程
  7. java值传递string_关于java:按值传递(StringBuilder与String)
  8. python3安装常见问题_有关在 Windows 上使用 Python 的常见问题解答
  9. 关于Memcached反射型DRDoS攻击分析
  10. LeetCode 234 Palindrome Linked List
  11. python manager_详解Python的Django框架中Manager方法的使用
  12. yanqiyetan V1.0 存档
  13. win10 计算机显示英文,电脑win10系统改了中文之后为何显示还是英文?
  14. NVMe驱动解析-DMA传输
  15. C#Socket编程TCP实例(四)
  16. 软件可靠性方法 学习笔记
  17. 数字信号处理 史林 课本答案---第三章
  18. 大数据去重bitmap以及布隆过滤器
  19. 梦想CAD软件(控件)图层介绍
  20. 【电商吧 - 3】支付第一步,支付宝网页支付!

热门文章

  1. Python中类的定义与实例化
  2. Sass、Less、Stylus,我选Sass!
  3. Linux命令·at
  4. 医学科研课题设计的分类
  5. 预防甲流4类中药配方
  6. 中药秘方——留着有用
  7. 北京工商大学计算机软件技术基础课件,《智能科学与技术专业发展问题》 课件.ppt...
  8. oracle 消耗资源的语句,oracle查询消耗服务器资源SQL语句
  9. 数据结构 栈-链栈及基本操作
  10. php 包含字母随机数_php生成随机数 生成随机字符串的5种方法