当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、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 RGB
    plt.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()

1


二、彩色直方图

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 RGB
    plt.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, r
    hist = []
    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") * 50

    added_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()

2


三、画出基本图形

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 RGB
    plt.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()")

3

  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()")

4

  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()")

5

  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")

6


四、图片上显示文本

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 RGB
    plt.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")

7


五、人脸检测

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

  • 原理: 使用 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)。
        8
import cv2 as cv

# 方法:绘制图片中检测到的人脸
def plot_rectangle(image, faces):
    # 拿到检测到的人脸数据(4个值):坐标(x, y), width, height
    for (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"):
                break
        else:
            break

    capture.release()
    cv.destroyAllWindows()

if __name__ == '__main__':
    main()

9


相关文章:

  • 【JavaWeb】一篇文章复习JDBC、DAO及相关实现类
  • java计算机毕业设计ssm 音乐播放交流论坛网站
  • GO开发环境配置
  • Docker-compose安装mysql
  • 字符函数和字符串函数(C语言)
  • zynq pl访问ps ddr
  • JavaEE初阶:HTML
  • IDEA中JDBC连接MYSQL数据库步骤超详细总结
  • docker 开启 nginx 容器
  • 109 使用Ajax传递请求本地数据库
  • 《算法系列》之设计
  • xerces-c++内存管理策略为何耗费大量内存
  • STM32学习笔记:驱动SPI外设读写FLASH
  • 操作系统安全 基本概念
  • 猿创征文——C++|string类2
  • 【译】JS基础算法脚本:字符串结尾
  • 【Leetcode】104. 二叉树的最大深度
  • 【面试系列】之二:关于js原型
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 03Go 类型总结
  • Angular4 模板式表单用法以及验证
  • Electron入门介绍
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java深入 - 深入理解Java集合
  • mongo索引构建
  • php面试题 汇集2
  • Spring Cloud Feign的两种使用姿势
  • SpriteKit 技巧之添加背景图片
  • 成为一名优秀的Developer的书单
  • 大型网站性能监测、分析与优化常见问题QA
  • 对JS继承的一点思考
  • 工程优化暨babel升级小记
  • 简析gRPC client 连接管理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 携程小程序初体验
  • 一个JAVA程序员成长之路分享
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ![CDATA[ ]] 是什么东东
  • (1)(1.13) SiK无线电高级配置(五)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十一)图像的罗伯特梯度锐化
  • (五)c52学习之旅-静态数码管
  • (一)SpringBoot3---尚硅谷总结
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)程序员技术练级攻略
  • (转)可以带来幸福的一本书
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .CSS-hover 的解释
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core使用ef 6
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)