兩周前收到老師要求參加模式識別比賽,大概內容是檢測視頻中出現的人臉,然后進行數目統計,一開始看到后毫無頭緒的,畢竟這是第一次接觸機器視覺類,完全沒有方向,后來在同學的見一下開始學習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,哈希值的重復位數來調整檢測結果,最終達到一個速度和準確度都滿意的值,
由于用于練習的視頻是監控錄像,截圖什么的就不放出了,最后感謝幫我指路和除錯程式的同學,也再次感謝各位前輩,前人種樹后人乘涼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198896.html
標籤:其他
上一篇:2020-10-31
