对比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

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