對比python學julia(第四章:人工智能)--(第一節)OpenCV編程初步(3)

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章