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
标签:img,python,frame,cv2,julia,OpenCV,人脸,faces,车牌 From: https://www.cnblogs.com/zjzkiss/p/16756152.html