两周前收到老师要求参加模式识别比赛,大概内容是检测视频中出现的人脸,然后进行数目统计,一开始看到后毫无头绪的,毕竟这是第一次接触机器视觉类,完全没有方向,后来在同学的见一下开始学习OPENCV,也一直帮我调试程序,在这里也谢谢他了。第一次写也不知道算不算原创,如果有任何违规的地方请告知我,我会更改和删除,谢谢。
大二的时候多少接触过51,32类的单片机,印象最深的便是基于STM32的OPENMV,可及时调用的现成库和机器视觉的第一次惊艳到了我,就先去网上找了CV的入门视频,大概明白了编程环境,语言等。虽然同学安利VSCODE,但最后还是用了Pycharm,语言是Python 3.5。当然在这过程中看了不少CSDN上大佬的文章受益匪浅。
借鉴的大佬们的博客:
https://blog.csdn.net/qq_40985985/article/details/108364144
https://blog.csdn.net/sinat_26917383/article/details/70287521
https://blog.csdn.net/haoji007/article/details/106368793/ (原文:https://zhuanlan.zhihu.com/p/80328340)
由于比赛要求特殊(我自己感觉是这样的),没有事先给素材进行模型训练,因此不能跑神经网络等算法,看了上面大佬们的博客,决定采用OPENCV自带的级联器+差值哈希算法来实现,感谢各位前辈们的付出
import cv2
# 差异值哈希算法
def dhash(image):
# 将图片转化为8*8
image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC)
# 将图片转化为灰度图
dhash_str = ''
for i in range(8):
for j in range(8):
if image[i, j] > image[i, j + 1]:
dhash_str = dhash_str + '1'
else:
dhash_str = dhash_str + '0'
result = ''
for i in range(0, 64, 4):
result += ''.join('%x' % int(dhash_str[i: i + 4], 2))
# print("dhash值",result)
return result
if __name__ == '__main__':
faceGascade = cv2.CascadeClassifier("Resources/haarcascade_frontalface_alt2.xml")
# 调用级联器
cap = cv2.VideoCapture("Resources/test1.mp4")
# 捕获视频帧
# cap = cv2.imread("Resources/1.png")
list1 = []
list2 = []
flag = 1
while cap.isOpened():
success, frame = cap.read()
if not success:
break
ImgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 转换为灰度图像,在这里转换了,因此计算哈希值时的图像转换被我删除了
ImgGray2 = ImgGray[200:1240, 0:2560]
# 将图像进行了裁剪,因为素材时一段监控录像,怕上面时间日期等影响效果
ImgGray2 = cv2.resize(ImgGray2, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
# 缩小了图像的分辨率来加快识别速度
faces = faceGascade.detectMultiScale(ImgGray2, 1.2, 10)
for (x, y, w, h) in faces:
cv2.rectangle(ImgGray2, (x, y), (x+w, y+h), (255, 0, 0), 2)
image = (ImgGray2[y:y+h, x:x+w])
hash2 = dhash(image)
if flag == 1:
flag = 0
list1.append(hash2)
list1.append(hash2)
n = 0
j = 0
for g in range(len(list1)-1):
# for hash1 in list1:
for k in range(len(list1[g])):
if (list1[g])[k] == hash2[k]:
n = n + 1
m = n
n = 0
# print(m)
if m > 6:
j = j+1
else:
pass
if j == 0:
list2.append(hash2)
# 来查重比较新捕获哈希值是否重复
print(len(list2))
# 打印出捕获的哈希值数量,即识别到的人数
cv2.imshow('video', ImgGray2)
cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
不断捕获人脸的哈希值,然后删除重复的并添加新的,通过改变
faces = faceGascade.detectMultiScale(ImgGray2, 1.2, 10)
中1.2和10两个参数
if m > 6:
j = j+1
还有m,哈希值的重复位数来调整检测结果,最终达到一个速度和准确度都满意的值。
由于用于练习的视频是监控录像,截图什么的就不放出了,最后感谢帮我指路和调试程序的同学,也再次感谢各位前辈,前人种树后人乘凉。