1.4. 人臉檢測
(續上)
3.檢測視頻中的人臉
在VSCode環境中,新建一個空白源文件,以detect_video.jl作爲文件名保存到項目文件夾中,然後編寫程序檢測視頻流中的人臉(正臉)。由於檢測視頻中的人臉與檢測圖像中的人臉,本質原理差不多,你只要知曉,視頻的每一幀其實都是一張圖像,就明白怎麼回事了。具體過程不在這裏詳述了,這裏貼出python代碼和julia代碼。大家可以做個比較。
Python代碼:
1 ''' 2 程序:檢測視頻中的人臉 3 作者:蘇秦@小海豚科學館公衆號 4 來源:圖書《Python趣味編程:從入門到人工智能》 5 ''' 6 import cv2 7 8 #創建人臉檢測器 9 file = 'haarcascade_frontalface_default.xml' 10 face_cascade = cv2.CascadeClassifier(file) 11 12 #加載視頻文件 13 vc = cv2.VideoCapture('images/video.mp4') 14 15 #處理視頻流 16 while True: 17 #讀取視頻幀 18 retval, frame = vc.read() 19 20 #按Q鍵退出 21 if not retval or cv2.waitKey(16) & 0xFF == ord('q'): 22 break 23 24 #檢測人臉區域 25 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 26 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 27 28 #標註人臉區域 29 for (x, y, w, h) in faces: 30 cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 3) 31 32 #顯示視頻幀到窗口 33 cv2.imshow('Video', frame) 34 35 #關閉視頻 36 vc.release() 37 38 #銷燬所有窗口 39 cv2.destroyAllWindows()
Julia代碼:
1 using PyCall 2 cv2=pyimport("cv2") 3 4 #創建人臉檢測器 5 file = "haarcascade_frontalface_default.xml" 6 face_cascade = cv2.CascadeClassifier(file) 7 8 #加載視頻文件 9 vc = cv2.VideoCapture("images/video.mp4") 10 11 #處理視頻流 12 while true 13 #讀取視頻幀 14 retval, frame = vc.read() 15 16 #按Q鍵退出 17 if !retval || cv2.waitKey(16) & 0xFF == Int64('q') 18 break 19 end 20 #檢測人臉區域 21 #將讀取的視頻幀圖像轉爲灰度圖像,再檢測灰度圖像中的人臉 22 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 24 if faces==() 25 continue 26 end 27 #Julia數組是列主數組,而cv需要行主數組。 28 #反轉維度,然後使用PyReverseDims數組 29 rframe = permutedims(frame, ndims(frame):-1:1) 30 pyframe = PyReverseDims(rframe) 31 #標註人臉區域 32 for i in 1:size(faces)[1] 33 x=faces[i,1] 34 y=faces[i,2] 35 w=faces[i,3] 36 h=faces[i,4] 37 cv2.rectangle(pyframe, (x, y), (x+w, y+h), (255, 0, 0), 3) 38 end 39 #顯示視頻幀到窗口 40 cv2.imshow("Video", pyframe) 41 end 42 #關閉視頻 43 vc.release() 44 45 #銷燬所有窗口 46 cv2.destroyAllWindows()
4.通過攝像頭檢測人臉
在VSCode環境中 ,新建一個空白的源文件, 以 detect_camea.jl 作爲文件名保存到“BaseOpenCV”文件夾中。在此文件中編寫代碼。檢測原理與從視頻中檢測人臉沒有差別,這裏僅貼出python代碼和julia代碼,供大家進行比較。
Python代碼:
1 ''' 2 程序:通過攝像頭檢測人臉 3 作者:蘇秦@小海豚科學館公衆號 4 來源:圖書《Python趣味編程:從入門到人工智能》 5 ''' 6 import cv2 7 8 #創建人臉檢測器 9 file = 'haarcascade_frontalface_default.xml' 10 face_cascade = cv2.CascadeClassifier(file) 11 12 #打開攝像頭,設置畫面大小 13 vc = cv2.VideoCapture(0) 14 vc.set(cv2.CAP_PROP_FRAME_WIDTH, 480) 15 vc.set(cv2.CAP_PROP_FRAME_HEIGHT, 320) 16 17 #處理視頻流 18 while True: 19 #讀取視頻幀圖像 20 retval, frame = vc.read() 21 22 #按Q鍵退出 23 if not retval or cv2.waitKey(16) & 0xFF == ord('q'): 24 break 25 26 #轉換爲灰度圖像,再進行人臉檢測 27 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 28 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 29 30 #標註人臉區域 31 for (x, y, w, h) in faces: 32 cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 3) 33 34 #將標註人臉的視頻幀圖像顯示到窗口中 35 cv2.imshow('Video', frame) 36 37 #關閉攝像頭 38 vc.release() 39 40 #銷燬所有窗口 41 cv2.destroyAllWindows()
julia代碼:
1 using PyCall 2 cv2=pyimport("cv2") 3 4 #創建人臉檢測器 5 file = "haarcascade_frontalface_default.xml" 6 face_cascade = cv2.CascadeClassifier(file) 7 8 #打開攝像頭,設置畫面大小 9 vc = cv2.VideoCapture(0) 10 vc.set(cv2.CAP_PROP_FRAME_WIDTH, 480) 11 vc.set(cv2.CAP_PROP_FRAME_HEIGHT, 320) 12 13 #處理視頻流 14 while true 15 #讀取視頻幀圖像 16 retval, frame = vc.read() 17 18 #按Q鍵退出 19 if !retval || cv2.waitKey(16) & 0xFF == Int64('q') 20 break 21 end 22 #轉換爲灰度圖像,再進行人臉檢測 23 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 24 faces = face_cascade.detectMultiScale(gray, 1.3, 5) 25 #Julia數組是列主數組,而cv需要行主數組。 26 #反轉維度,然後使用PyReverseDims數組 27 rframe = permutedims(frame, ndims(frame):-1:1) 28 pyframe = PyReverseDims(rframe) 29 30 #=標註人臉區域 31 for i in 1:size(faces)[1] 32 x=faces[i,1] 33 y=faces[i,2] 34 w=faces[i,3] 35 h=faces[i,4] 36 cv2.rectangle(pyframe, (x, y), (x+w, y+h), (255, 0, 0), 3) 37 end 38 #將標註人臉的視頻幀圖像顯示到窗口中 39 cv2.imshow("Video", pyframe) 40 end 41 #關閉攝像頭 42 vc.release() 43 44 #銷燬所有窗口 45 cv2.destroyAllWindows()
1.5. 車牌檢測
不僅可以使用OpenCV迸行人臉檢測,還可以用它進行車牌檢測o 撿測車牌的程序與撿測人臉的程序類似,只要使用車牌特徵數據創建一個車牌檢測器就可以用來撿測車牌。
從原書的“資源包/第 32課/”中把“1.5. 車牌檢測”文件夾中用於檢測的車牌圖像和車牌特徵數據文件拷貝到“BaseOpenCV”文件夾中。
創建一個名爲detect_number.jl 的源文件,並輸人代碼實現檢測車牌的功能。
Python代碼:
1 ''' 2 程序:車牌檢測 3 作者:蘇秦@小海豚科學館公衆號 4 來源:圖書《Python趣味編程:從入門到人工智能》 5 ''' 6 import cv2 7 8 #從文件中讀取圖像並轉爲灰度圖像 9 img = cv2.imread('images/car1.jpg') 10 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 11 12 #創建車牌檢測器 13 file = 'haarcascade_russian_plate_number.xml' 14 face_cascade = cv2.CascadeClassifier(file) 15 16 #檢測車牌區域 17 faces = face_cascade.detectMultiScale(img, 1.2, 5) 18 19 for (x, y, w, h) in faces: 20 #標註車牌區域 21 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 3) 22 #將車牌區域的圖像寫入文件 23 number_img = img[y:y+h, x:x+w] 24 print(number_img) 25 cv2.imwrite('images/car_number.jpg', number_img) 26 27 #顯示檢測結果到窗口 28 cv2.imshow('Image', img) 29 30 #按任意鍵退出 31 cv2.waitKey(0) 32 33 #銷燬所有窗口 34 cv2.destroyAllWindows()
Julia代碼:
1 using PyCall 2 cv2=pyimport("cv2") 3 4 #從文件中讀取圖像並轉爲灰度圖像 5 img = cv2.imread("images/car1.jpg") 6 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 7 8 #創建車牌檢測器 9 file = "haarcascade_russian_plate_number.xml" 10 face_cascade = cv2.CascadeClassifier(file) 11 12 #檢測車牌區域 13 faces = face_cascade.detectMultiScale(img, 1.2, 5) 14 #= 15 for (x, y, w, h) in faces: 16 #標註車牌區域 17 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 3) 18 #將車牌區域的圖像寫入文件 19 number_img = img[y:y+h, x:x+w] 20 cv2.imwrite("images/car_number.jpg", number_img) 21 =# 22 #Julia數組是列主數組,而cv需要行主數組。 23 #反轉維度,然後使用PyReverseDims數組 24 rimg = permutedims(img, ndims(img):-1:1) 25 pyimg = PyReverseDims(rimg) 26 for i in 1:size(faces)[1] 27 x=faces[i,1] 28 y=faces[i,2] 29 w=faces[i,3] 30 h=faces[i,4] 31 #標註車牌區域 32 out=cv2.rectangle(pyimg, (x, y), (x+w, y+h), (255, 0, 0), 3) 33 #將車牌區域的圖像寫入文件 34 outimg=out[y:y+h, x:x+w,1:3] 35 pimg=permutedims(outimg, ndims(out):-1:1) 36 number_img=PyReverseDims(pimg) 37 cv2.imwrite("images/car_number.jpg", number_img) 38 end 39 #顯示檢測結果到窗口 40 cv2.imshow("Image", pyimg) 41 42 #按任意鍵退出 43 cv2.waitKey(0) 44 45 #銷燬所有窗口 46 cv2.destroyAllWindows()
運行代碼的結果如下:
在images目錄下,你能找到圖片car_number.jpg。
源碼下載:https://files.cnblogs.com/files/zjzkiss/detect_number.zip