一、OpenCV简介

OpenCV(全称:Open Source Computer Vision Library),是一个跨平台的计算机视觉库。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
​ OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java和MATLAB/OCTAVE(2.5)的接口。如今也提供对于C#、Ch、Ruby、GO的支持。

二、OpenCV的基本使用

1.安装OpenCV模块

pip install opencv-python

2.读取图片

显示图像是OpenCV最基本的操作之一,imshow()函数可以实现该操作。imshow()函数有两个参数:显示图像的帧名称以及要显示的图像本身。
如果直接调用imshow()函数,只能短暂地显示图像。要保证图像一直在窗口上显示,要通过waitKey()函数。waitKey()函数的参数为等待键盘触发的时间,单位为毫秒,返回值为-1(表示没有键被按下)。

示例代码:

# 导入模块
import cv2 as cv# 读取图片
image = cv.imread('test.png')  # 路径中不能有中文,否则加载图片失败
# 显示图片
cv.imshow('read_img', image)
# 等待键盘输入 单位毫秒 传入0则是无限等待
cv.waitKey(0)
# 由于OpenCV底层是C++编写的,需要释放内存
cv.destroyAllWindows()

测试图片:

测试效果:


3.图片灰度转换

OpenCV中有数百种关于在不同色彩空间之间转换的方法。当前,在计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue,Saturation,Value)。

  • 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸识别。
  • BGR即蓝、绿、红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。网页开发者可能熟悉另一个与之相似的颜色空间——RGB,它们只是颜色顺序不同。
  • HSV,H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度(或光谱另一端的明亮程度)。
  • 灰度转换的作用是:转换成灰度的图片的计算强度得以降低。

示例代码:

import cv2 as cv# 加载图片
img = cv.imread('test.png')
# 显示图片
cv.imshow('BGR image', img)
# cv2读取图片的通道是BGR(蓝绿红)
# PIL读取图片的通道是RGB
# 将图片灰度转换
gray_img = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)
# 显示转换后的图片
cv.imshow('gray_image', gray_img)
# 保存图片
cv.imwrite('gray_test.png', gray_img)
# 等待键盘输入
cv.waitKey(0)
# 释放内存
cv.destroyAllWindows()

效果:

4.修改图片尺寸

示例代码:

import cv2 as cv# 加载图片
img = cv.imread('test.png')# 显示图片
# cv.imshow('input image', img)
print("原图片的形状", img.shape)
# 修改图片尺寸
# resize_img = cv.resize(img, dsize=(110, 160))
resize_img = cv.resize(img, dsize=(400, 360))
print("修改后图片的形状", resize_img.shape)
cv.imshow('resize_img', resize_img)
# 键盘输入q的时候,退出
while True:if ord('q') == cv.waitKey(0):break
# 释放内存
cv.destroyAllWindows()

效果:

5.绘制矩形、圆

OpenCV可以对图片进行任意编辑、处理。

示例代码

import cv2 as cv
img = cv.imread('test.png')
# 左上角的坐标是(x,y),矩形的宽度为w,高度为h
x, y, w, h = 50, 50, 80, 80
# 画矩形
cv.rectangle(img, (x, y, x+w, y+h), color=(0, 255, 255), thickness=2) # color=BGR,thickness参数表示画笔的粗细/线条宽度
# 画圆
# center元组指原点的坐标,radius为半径
cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 0, 255), thickness=2)
resize_img = cv.resize(img, dsize=(420, 360))
# 显示图片
cv.imshow('result_image', resize_img)
cv.waitKey(0)
# 释放内存
cv.destroyAllWindows()

效果:


6.人脸检测

6.1Haar级联的概念

由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。这些提取的结果被称为特征,专业的表述为:从图像数据中提取特征。两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。
Haar特征是一种用于实现人脸跟踪的特征。每一个Haar特征都描述了相邻图像区域的对比模式。例如,边、顶点和细线都能生成具有判别性的特征。

6.2获取Haar级联数据

OpenCV提供了人脸检测所需的XML文件,可用于检测静止图像、视频和摄像头所得到图像中的人脸。

  • 人脸检测器(默认):haarcascade_frontalface_default.xml
  • 人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml
  • 人脸检测器(侧视):haarcascade_profileface.xml
  • 眼部检测器(左眼):haarcascade_lefteye_2splits.xml
  • 眼部检测器(右眼):haarcascade_righteye_2splits.xml
  • 嘴部检测器:haarcascade_mcs_mouth.xml
  • 鼻子检测器:haarcascade_mcs_nose.xml
  • 身体检测器:haarcascade_fullbody.xml
  • 人脸检测器(快速LBP):lbpcascade_frontalface.xml

6.3使用OpenCV进行人脸检测

6.3.1静态图像中人脸检测
6.3.1.1检测人脸

示例代码:

import cv2 as cvdef face_detect_demo():# 将图片转换为灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域faces = face_detector.detectMultiScale(gray)for x, y, w, h in faces:# 绘制矩形cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2)# 显示图片cv.imshow('result', img)# 加载图片
img = cv.imread('huge.jpeg')
face_detect_demo()
# cv.imshow('input image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果:


6.3.1.2检测多张人脸

示例代码:

import cv2 as cv# 定义人脸检测方法
def face_detect_demo():# 将图片灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域# 发现有一些没检测出来faces = face_detector.detectMultiScale(gray, scaleFactor=1.01, minNeighbors=3, maxSize=(40, 40), minSize=(35, 35))for x, y, w, h in faces:print(x, y, w, h)cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)# 显示图片cv.imshow('result', img)# 加载图片
img = cv.imread('2.jpeg')
# 调用人脸检测方法
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()

测试图片:

效果:


6.3.2视频中的人脸检测

视频是一张张图片组成的,在视频的帧上重复这个过程就能完成视频中的人脸检测。

示例代码:

import cv2 as cvdef face_detect_demo(img):# 将图片转换为灰度gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 加载特征数据face_detector = cv.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# faces为检测区域faces = face_detector.detectMultiScale(gray, flags=cv.CASCADE_SCALE_IMAGE)for x, y, w, h in faces:# 绘制矩形cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)# 可调整窗口大小cv.namedWindow('result', 0)# 调整窗口大小cv.resizeWindow('result', 500, 500)# 显示图片cv.imshow('result', img)# 读取视频
cap = cv.VideoCapture('test.mp4')
while True:# frame就是每一帧的图像,是个三维矩阵(按帧读取)flag, frame = cap.read()print(f'flag:{flag}, frame.shape:{frame.shape}')if not flag:# 视频播放结束,退出breakface_detect_demo(frame)if ord('q') == cv.waitKey(0):break
# 释放内存
cv.destroyAllWindows()
cap.release()

效果:

6.3.3人脸识别

人脸识别其实就是一个程序能识别给定图像或视频中的人脸。实现这一目标的方法之一是用一系列分好类的图像来”训练“程序,并基于这些图像来进行识别。这就是OpenCV及其人脸识别模块进行人脸识别的过程。
人脸识别模块的另一个重要特征是:每个识别都具有转置信评分,因此可在实际应用中通过对其设置阈值来进行筛选。
人脸识别所需要的人脸可以通过两种方式来得到:自己获得图像或从人脸数据库免费获得可用的人脸图像。

6.3.3.1训练数据

有了数据,需要将这些样本图像加载到人脸识别算法中。所有的人脸识别算法在它们的train()函数都有两个参数:图像数组和标签数组。这些标签表示进行识别时某人人脸的ID,因此根据ID可以知道被识别的人是谁。要做到这一点,将在”trainer/“目录中保存为.yml文件。

在使用Python 3&OpenCV 3.0.0进行人脸识别训练时发现异常:
AttributeError:'module' object has no attribute 'LBPHFaceRecognizer_create' OpenCV ,需要安装opencv-contrib-python模块:

pip install opencv-contrib-python

示例代码:

import os
import cv2import numpy as np
from PIL import Imagedef getImageAndLabels(path):facesSamples = []ids = []imagePaths = [os.path.join(path, f) for f in os.listdir(path)]# 检测人脸face_detector = cv2.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 遍历列表中的图片for imagePath in imagePaths:# 打开图片PIL_img = Image.open(imagePath).convert('L')# 将图像转换为数组img_numpy = np.array(PIL_img, 'uint8')# faces为检测区域faces = face_detector.detectMultiScale(img_numpy)# 获取每张图片的idid = int(os.path.split(imagePath)[1].split('.')[0])for x, y, w, h in faces:facesSamples.append(img_numpy[y:y+h, x:x+w])ids.append(id)return facesSamples, idsif __name__ == '__main__':# 图片路径path = './data/jm/'# 获取图像数组和id标签数组faces, ids = getImageAndLabels(path)# 获取循环对象"""AttributeError: module 'cv2' has no attribute 'face'"""recognizer = cv2.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))# 保存文件recognizer.write('trainer/trainer.yml')

训练部分图像:

6.3.3.2基于LBPH的人脸识别

LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单位进行比较,对每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。
调整后的区域中调用predict()函数,该函数返回两个元素的数组:第一个元素是所识别个体的标签,第二个是置信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来衡量所识别人脸与原模型的差距,0表示完全匹配。
有时不想保留所有的识别结果,则需要进一步处理,因此可用自己的算法来估算识别的置信度评分。LBPH一个好的识别参考值要低于50,任何一个高于80的参考值都会被认为是低的置信度评分。

示例代码:

import cv2# 加载训练数据集文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')# 准备识别的图片
img = cv2.imread('7.bmp')
# 将图片转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv2.CascadeClassifier('D:\software\Python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# faces为检测区域
faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:# 绘制矩形cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)# 人脸识别id,confidence = recognizer.predict(gray[y:y+h, x:x+w])print(f"标签id:{id},置信评分:{confidence}")
# 显示图片
cv2.imshow('result', img)
cv2.waitKey(0)
# 释放内存
cv2.destroyAllWindows()

测试图像:

测试效果:

因为上面这个图像不在训练数据中,所以置信评分高于80。

换成下面这个图像(jim文件夹下的11.bmp)进行测试:

测试效果:

在训练数据中,置信评分为0。


参考文章及其它:

  • https://blog.csdn.net/weixin_43493559/article/details/106600471
  • B站视频:OpenCv人脸识别开发实战
  • https://blog.csdn.net/shangxiaqiusuo1/article/details/84888408
  • ORL人脸数据库40个:http://www.qudong51.net/qudong/1040.html
  • http://www.webzuan.cn/szk/7194.html
  • https://blog.csdn.net/qq_52131774/article/details/121265931

OpenCv人脸识别开发实战相关推荐

  1. 实战 | 如何用最快的速度学会Dlib人脸识别开发?

    作者 | 小宋是呢 来源 | 转载自小宋是呢 项目GitHub地址:https://github.com/xiaosongshine/dlib_face_recognition 1.背景介绍 Dlib ...

  2. [深度应用]·实战掌握Dlib人脸识别开发教程

    [深度应用]·实战掌握Dlib人脸识别开发教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com/xi ...

  3. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核

    移植opencv人脸识别 libz:    zlib-1.2.3 libjpeg:   jpegsrc.v6b libpng:   libpng-1.2.18 libyasm:   yasm-0.7. ...

  4. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  5. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

  6. 【转】OpenCV人脸识别

    转自:https://blog.csdn.net/learning_tortosie/article/details/85121576 写在前面 这是Adrian Rosebrock博客的第二篇翻译, ...

  7. [深度学习概念]·深度学习中人脸识别开发解析

    深度学习中人脸识别开发解析 目录 人脸识别介绍 人脸识别算法 实战解析 参考文献 人脸识别介绍 人脸识别是什么 人脸识别问题宏观上分为两类:1. 人脸验证(又叫人脸比对)2. 人脸识别. 人脸验证做的 ...

  8. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  9. 图像识别——(java)opencv(人脸识别简单实现)

    人脸识别 package com.acts.opencv.demo;import javax.servlet.http.HttpServletRequest; import javax.servlet ...

最新文章

  1. 潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...
  2. php水平垂直居中,html水平垂直居中的问题
  3. 看到了商机,为什么赚不到钱?
  4. 技术人员转型是件痛苦的事情~
  5. oracle的本地安装和PUTTY+XMING远程连接安装和oracle翻页功能
  6. 专访20年技术老兵云郎:16年峰回路,每一步都是更好的沉淀
  7. python元祖封包_[Day8]遷延蹉跎,來日無多-python終極指南:模組和封包,外掛般的超能力...
  8. Android学习总结(3)——Handler深入详解
  9. jQueryQQ音乐动态轮播图
  10. 自定义Angular服务
  11. 架构运维篇(二):Centos7/Linux安装部署Tomcat环境
  12. 软件著作权算法软件设计说明书_软件著作权设计说明书模板.docx
  13. r语言degseq2_第二次RNA-seq实战总结(3)-用DESeq2进行基因表达差异分析
  14. 【干货】火山视频去水印下载使用介绍
  15. 永久删除计算机文件怎么操作步骤,如何彻底删除掉电脑文件夹
  16. 乐山市计算机学校灵异事件,我也来说个以前上学时候的灵异事件
  17. 如何有效开展小组教学_如何有效地开展小组教学研究初探
  18. 无人机开发-介绍Mavlink协议的消息组成、如何看懂繁杂的mavlink官网介绍、简单介绍地面站与飞控的通讯流程
  19. Ubuntu 18.04上跑通LSD SLAM
  20. viso画图时如何让右侧显示设置形状格式栏

热门文章

  1. linux命令赋子包777权限,linux对文件赋权限的命令chmod的详细说明
  2. MySQL的四种隔离级别
  3. 【硬件架构的艺术】学习笔记(4)流水线的艺术
  4. nvidia-smi无法与driver通信
  5. 写一个程序来模拟网桥功能。
  6. CAD图纸能转换成图片吗
  7. IBDP学生如何申请中国香港的大学?
  8. 一台电脑2个mysql数据库_一台电脑装两个mysql数据库
  9. 滴滴如何基于开源引擎,打造自主可控服务体系
  10. nginx代理mysql连接