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

对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(3)的更多相关文章

  1. python学习心得第四章

     python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...

  2. 进击的Python【第十四章】:Web前端基础之Javascript

    进击的Python[第十四章]:Web前端基础之Javascript 一.javascript是什么 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编 ...

  3. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  4. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  5. 《零压力学Python》 之 第四章知识点归纳

    第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...

  6. python 教程 第十四章、 地址薄作业

    第十四章. 地址薄作业 #A Byte of Python #!/usr/bin/env python import cPickle import os #define the contacts fi ...

  7. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  8. 【Learning Python】【第四章】Python代码结构(一)

    这一章的主旨在于介绍python的代码结构 缩进 在很多的编程语言中,一般{}用于控制代码块,比如以下的一段C代码 if(var <= 10) { printf("....." ...

  9. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  10. Python之旅.第四章.模块与包.总结(未完待遇)

    一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...

随机推荐

  1. powerpoint 无法打开文件

    PowerPoint 无法打开文件 出现的问题 今天下载老师放在学习通的ppt,居然不能打开,记录一下 点击修复后出现: 这并不是文件损坏了,而是powerpoint出于安全的考虑,为了保护我们的计算 ...

  2. Apache 服务搭建

    Apache 一.了解apache Apache(或httpd)是Internet上使用最多的Web服务器技术之一,使用的传输协议是http(Hypertext Transfer Protocol), ...

  3. ctfshow-超详细通关教程-web(1~8)

    快捷目录 web1 web2 web3 web4 web5 web6 web7 web8 1.web签到题 打开网址后出现如下界面. 查看一下网站源码 将Y3Rmc2hvd3s1ZjkxNTc3Yy0 ...

  4. 使用 Java 客户端通过 HTTPS 连接到 Easysearch

    Easysearch 一直致力于提高易用性,这也是我们的核心宗旨,然而之前一直没有官方的 Java 客户端,也对用户使用造成了一些困扰,现在,我们正式发布了第一个 Java 客户端 Easysearc ...

  5. Elasticsearch之Nested Query nestedQuery查询数组

    es是通过符合条件的json记录找出来,本身并不是将数据中的记录filter过滤.es nestedQuery不是过滤的结果,是匹配的这条es记录,所以数组中的其他的记录也会查询出来1.方法1:可以在 ...

  6. Failed to connect to codeup.aliyun.com port 443 after 21017 ms: Couldn't connect to server Git

    Git拉取出现这个错误 Failed to connect to codeup.aliyun.com port 443 after 21017 ms: Couldn't connect to serv ...

  7. 一次phoniex表查询报出 org.apache.hadoop.hbase.NotServingRegionException

    org.apache.hadoop.hbase.NotServingRegionException: SYSTEM.STATS,,1607503004410.334266e1a9b7d9859dbfb ...

  8. C# .NET 常见DeepCopy 深度拷贝的性能对比

    先上结论 Method Mean Error StdDev Gen0 Gen1 Allocated JSONConvert 2,273.02 ns 43.758 ns 52.091 ns 0.6599 ...

  9. pytest-allure 命令生成的报告,test body 没有具体的参数和日志

    run.py: pytest.main([命令参数执行]),pytest命令执行完毕后,使用os.system()执行allure的命令 原因: 使用了命令:os.system('allure gen ...

  10. Oracle常用命令收藏

    查看数据库名 SELECT t.NAME FROM V$DATABASE t; 查看实例名 SELECT t.INSTANCE_NAME FROM V$INSTANCE t; 查看SID select ...