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

图像特征描述和人脸识别

CV_tutorial2

  • 特征检测
    • 使用HOG实现行人检测
    • Harris角点检测
    • 关键特征检测SIFT
    • 纹理特征 LBP算法
  • 模板匹配
  • 人脸识别

特征检测

使用HOG实现行人检测

HOG方向梯度直方图

实现过程:

  1. 灰度化(为了去掉颜色、光照对形状的影响);
  2. 采用Gamma校正法对输入图像进行颜色空间的标准化(使得图像输入更符合肉眼看上去更加柔和的状态);
  3. 计算每个像素的梯度,包括方向和大小;
  4. 将图像划分成小cells;
  5. 统计每个cell的梯度直方图,得到cell的描述子;
  6. 将每几个cell组成一个block,得到block的描述子;
  7. 将图像image内的所有block的HOG特征descriptor串联起来就可以得到HOG特征,该特征向量就是用来目标检测或分类的特征。
import cv2
import numpy as np
# 判断矩形i是否完全包含在矩形o中
def is_inside(o, i):ox, oy, ow, oh = 0ix, iy, iw, ih = ireturn ox > ix and oy > iy and ox+ow < ix+iw and oy+oh < iy+ih# 对人体绘制颜色框
def draw_person(image, person):x, y, w, h = personcv2.rectangle(image, (x,y), (x+w, y+h), (0,0,255), 1)
img = cv2.imread("person.png")
hog = cv2.HOGDescriptor() # 启动检测器对象
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 指定检测器类型为人体
found, w = hog.detectMultiScale(img, 0.1, (1,1)) # 加载并检测对象
print(found)# 丢弃某些完全被其它矩形包含在内的矩形,即其他都加入队列里
found_filtered = []
for ri, r in enumerate(found):for qi, q in enumerate(found):if ri != qi and is_inside(r, q):breakelse:found_filtered.append(r)print(found_filtered)
# 对其他有效矩形进行框定
for person in person_filtered:draw_person(img, person)
cv2.imshow("person detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

行人检测结果:
在这里插入图片描述
换了其他图片,发现这是效果最好的一张☝️

Harris角点检测

实现过程:

  1. 计算图像在x和y方向的梯度
  2. 计算图像两个方向的梯度的乘积
  3. 使用高斯函数对三者进行高斯加权,生成矩阵M的A, B, C
  4. 计算每个像素的Harris响应值R,并对小于某一阈值t的R置为零
  5. 在3x3或5x5的邻域内进行非最大值抑制,局部最大值点即为图像的角点
import cv2
import numpy as np
img = cv2.imread("img.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray) # 转换成numpy矩阵# 输入图像必须是float32,blockSize,kernelsize,最后一个自由参数
#(经验取值在0.03~0.06之间)
dst = cv2.cornerHarris(gray, 2, 3, 0.03)# 设定角点阈值,不同图像阈值不同
# 将角点用红色标注
img[dst>0.01*dst.max()]=[0, 0, 255]
# print(dst.max()) # 533091900.0
cv2.imshow("dst_img",img)
cv2.waitKey(0)
cv2.destryAllWindows()

角点检测:
在这里插入图片描述在原图上进行角点标注:
在这里插入图片描述
可以对角点进行膨胀,看得更清楚:

dst = cv2.dilate(dst,None)

在这里插入图片描述
单纯使用Harris的话,稍微复杂一点检测效果不佳
在这里插入图片描述

关键特征检测SIFT

Scale-invariant feature transform, 尺度不变特征变换算法
实现过程:

  1. 尺度空间极值检测点检测
  2. 关键点定位:去除一些不好的特征点
  3. 关键点方向参数:获取关键点所在尺度空间的邻域,然后计算该区域的梯度和方向,根据计算结果创建方向直方图,直方图的峰值为主方向的参数
  4. 关键点描述:每个关键点用一组向量(位置、尺度、方向)将这个关键点描述出来,使其不随着光照、视角等等影响而改变【优势】
  5. 关键点匹配:分别对模板图和实时图建立关键点描述符集合,通过对比关键点描述符来判断两个关键点是否相同

OpenCV > 4.0受到专利限制移除了xfeatures2d函数

import cv2
import numpy as np
img = cv2.imread("1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None) # 找到关键点
img = cv2.drawKeypoints(gray, kp, img) # 绘制关键点cv2.imshow('sp', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

纹理特征 LBP算法

Local Binary Pattern, 局部二值模式
LBP算子定义在3X3的窗口内,以窗口中心为阈值,与相邻的8个像素的灰度值比较,若周围的像素值大于中心像素值,则该位置被标为1;否则标记为0。

def LBP(src):height = src.shape[0]width = src.shape[1]dst = src.copy() # 浅拷贝lbp_value = np.zeros((1, 8), dtype=np.uint8)neighbours = np.zeros((1, 8), dtype=np.uint8)for x in range(1, width-1):for y in range(1, height-1):neighbours[0, 0] = src[y - 1, x - 1]neighbours[0, 1] = src[y - 1, x]neighbours[0, 2] = src[y - 1, x + 1]neighbours[0, 3] = src[y, x - 1]neighbours[0, 4] = src[y, x + 1]neighbours[0, 5] = src[y + 1, x - 1]neighbours[0, 6] = src[y + 1, x]neighbours[0, 7] = src[y + 1, x + 1]center = src[y, x]for i in range(8):if neighbours[0, i] > center:lbp_value[0, i] = 1else:lbp_value[0, i] = 0# 计算lbp值(即二进制到十进制)lbp = lbp_value[0, 0] * 1 + lbp_value[0, 1] * 2 + lbp_value[0, 2] * 4 + lbp_value[0, 3] * 8 \+ lbp_value[0, 4] * 16 + lbp_value[0, 5] * 32 + lbp_value[0, 6] * 64 + lbp_value[0, 7] * 128# 将中心值改为lbp值dst[y, x] = lbpreturn dstimport cv2
import numpy as np
img = cv2.imread('building.png', 0) # 以单通道读入图像
# 看下源图
cv2.imshow('src',img)
cv2.waitKey(0)
cv2.destroyAllWindows()new_img = LBP(img)cv2.imshow('lbp',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

模板匹配

人脸识别

一个完整的人脸识别系统一般包含4个主要组成部分:

  1. 人脸检测(人脸位置)Face Detect
  2. 人脸对齐(五官位置)Face Alignment
  3. 人脸特征提取(抽象为字符串信息)Face Feature Extraction
  4. 人脸识别(计算相似度,确认身份)Face Recognition
  • OpenCV封装的人脸检测方法
import cv2img = cv2.imread("1.png")
# 检测器,加载人脸特征(该文件在python安装目录下)
face_cascade = cv2.CascadeClassifier(r'haaracascade_frontalface_default.xml')
# 灰度图减少计算强度(避免颜色干扰)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测的一个人脸坐标[x,y,w,h]是一个list,所以list的数量就是人脸数量
faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 4, minSize = (5, 5))
print("Faces:{0}".format(len(faces)))# 用矩形圈出人脸的位置(提供左上角和右下角坐标)
for(x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imshow("Faces", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Face : 1
在这里插入图片描述
通过其他照片的试验,OpenCV自带的方法和dilb对于标准正脸检测OK的,但是对于侧脸(不同角度)以及低像素基本完全不OK

  • 使用dlib中的方法
# -*- coding:utf-8 -*-
import cv2
import dlib
import numpy as nppredictor_model = 'shape_predictor_68_face_landmarks/shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_model)

dlib库没办法直接pip安装
找python3.8对应的dlib的轮子找了好一会儿,放百度盘了需要自取

许多博客尤其是CSDN,免费开源的放自己文章里收费😅,很不友好,目前还是习惯在这里记一些流水帐笔记😞

http://www.lryc.cn/news/143078.html

相关文章:

  • 浅谈Lua协程和函数的尾调用
  • 【VS Code插件开发】状态栏(五)
  • 睿趣科技:抖音开网店要怎么找货源
  • 表和Json的相互操作
  • 每日后端面试5题 第八天
  • mysql数据库和数据表
  • MySQL执行更新的流程
  • 要获取 PHP 中当前时间的前一天、本周、本月、本季度和本年,可以使用 PHP 的内置日期和时间函数。
  • java八股文面试[java基础]——如何实现不可变的类
  • juc基础(四)
  • C++智能指针weak_ptr的作用
  • lintcode 344 · 歌曲时间【背包问题,动态规划】
  • Qt应用开发(基础篇)——对话框窗口 QDialog
  • Linux系统:CentOS 7 CA证书服务器部署
  • C++图形界面编程-MFC
  • 知识扩展贴 圆越大,其圆接触的无知面就越多
  • 怎么把pdf转换成jpg格式?
  • Android SDK 上手指南||第六章 用户交互
  • Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘
  • 【大模型AIGC系列课程 2-3】动手为ChatGPT打造第二大脑
  • 【ARM AMBA AXI 入门 10 - AXI 总线 DATA信号与 STRB 信号之间的关系 】
  • 软引用的使用场景-链路日志
  • 【java】【项目实战】[外卖七]手机短信开发
  • Web 开发 Django 模板
  • 动态可编辑表单项
  • 【Docker入门第一篇】
  • 数据集收集列表(opencv,机器学习,深度学习)持续更新
  • springboot整合rabbitmq发布确认高级
  • 【linux命令讲解大全】010. mapfile命令和tempfile命令的用法及示例
  • 在 Python 中构建卷积神经网络; 从 0 到 9 的手绘数字的灰度图像预测数字