自学网站编程,传媒公司网站源码,vps网站管理助手教程,百度搜索引擎的优缺点CV_tutorial2 特征检测使用HOG实现行人检测Harris角点检测关键特征检测SIFT纹理特征 LBP算法 模板匹配人脸识别 特征检测
使用HOG实现行人检测
HOG方向梯度直方图
实现过程#xff1a;
灰度化#xff08;为了去掉颜色、光照对形状的影响#xff09;;采用Gamma校正法对输… CV_tutorial2 特征检测使用HOG实现行人检测Harris角点检测关键特征检测SIFT纹理特征 LBP算法 模板匹配人脸识别 特征检测
使用HOG实现行人检测
HOG方向梯度直方图
实现过程
灰度化为了去掉颜色、光照对形状的影响;采用Gamma校正法对输入图像进行颜色空间的标准化使得图像输入更符合肉眼看上去更加柔和的状态;计算每个像素的梯度包括方向和大小;将图像划分成小cells;统计每个cell的梯度直方图得到cell的描述子将每几个cell组成一个block得到block的描述子将图像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 oxow ixiw and oyoh iyih# 对人体绘制颜色框
def draw_person(image, person):x, y, w, h personcv2.rectangle(image, (x,y), (xw, yh), (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角点检测
实现过程
计算图像在x和y方向的梯度计算图像两个方向的梯度的乘积使用高斯函数对三者进行高斯加权生成矩阵M的A, B, C计算每个像素的Harris响应值R并对小于某一阈值t的R置为零在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矩阵# 输入图像必须是float32blockSizekernelsize最后一个自由参数
#经验取值在0.03~0.06之间
dst cv2.cornerHarris(gray, 2, 3, 0.03)# 设定角点阈值不同图像阈值不同
# 将角点用红色标注
img[dst0.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, 尺度不变特征变换算法 实现过程
尺度空间极值检测点检测关键点定位去除一些不好的特征点关键点方向参数获取关键点所在尺度空间的邻域然后计算该区域的梯度和方向根据计算结果创建方向直方图直方图的峰值为主方向的参数关键点描述每个关键点用一组向量位置、尺度、方向将这个关键点描述出来使其不随着光照、视角等等影响而改变【优势】关键点匹配分别对模板图和实时图建立关键点描述符集合通过对比关键点描述符来判断两个关键点是否相同
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), dtypenp.uint8)neighbours np.zeros((1, 8), dtypenp.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个主要组成部分
人脸检测人脸位置Face Detect人脸对齐五官位置Face Alignment人脸特征提取抽象为字符串信息Face Feature Extraction人脸识别计算相似度确认身份Face Recognition
OpenCV封装的人脸检测方法
import cv2img cv2.imread(1.png)
# 检测器加载人脸特征该文件在python安装目录下
face_cascade cv2.CascadeClassifier(rhaaracascade_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中的方法
# -*- codingutf-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免费开源的放自己文章里收费很不友好目前还是习惯在这里记一些流水帐笔记