对比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
对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(3)的更多相关文章
- python学习心得第四章
python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...
- 进击的Python【第十四章】:Web前端基础之Javascript
进击的Python[第十四章]:Web前端基础之Javascript 一.javascript是什么 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编 ...
- 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表
(先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- 《零压力学Python》 之 第四章知识点归纳
第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...
- python 教程 第十四章、 地址薄作业
第十四章. 地址薄作业 #A Byte of Python #!/usr/bin/env python import cPickle import os #define the contacts fi ...
- 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流
知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...
- 【Learning Python】【第四章】Python代码结构(一)
这一章的主旨在于介绍python的代码结构 缩进 在很多的编程语言中,一般{}用于控制代码块,比如以下的一段C代码 if(var <= 10) { printf("....." ...
- Python开发【第四章】:Python函数剖析
一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...
- Python之旅.第四章.模块与包.总结(未完待遇)
一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...
随机推荐
- NET工控,上位机,Modbus485网口/串口通讯(鸣志步进电机,鸣志伺服电机,松下伺服电机,华庆军继电器模块)
先上两个通用Modbus帮助类,下面这个是多线程不安全版,在多线程多电机同一端口通信下,可能造成步进电机丢步或者输出口无响应等,还有个多线程安全版,只是基于这个不安全版加上了LOCK,THIS usi ...
- Redis 常用的数据结构简介与实例测试【Redis 系列二】
〇.都有哪些数据结构? Redis 提供了较为丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合).Zset(有序集合). 随着 Redis 版本的 ...
- SELinux策略语法以及示例策略
首发公号:Rand_cs SELinux策略语法以及示例策略 本文来讲述 SELinux 策略常用的语法,然后解读一下 SELinux 这个项目中给出的示例策略 安全上下文 首先来看一下安全上下文的格 ...
- 算法金 | LSTM 原作者带队,一个强大的算法模型杀回来了
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 时间拉回 2019 年,有「计算机界诺贝尔奖」之称图灵奖获得者公布,深度学习三巨头:Y ...
- Windows Server 2016 离线安装.NET Framework 3.5
Windows Server 2016 离线安装.NET Framework 3.5 1.双击Windows Server 2016的ISO,会自动挂载,比如F盘. 2.右键开始菜单- 命令提示符(管 ...
- windows 命令行调整跃点数
先用 route print -4 命令找到接口号: 接口列表10...00 ff 51 c4 53 b4 ......TAP-Windows Adapter V918...18 c0 4d 29 5 ...
- Java实际工作里用到的几种加密方式
1.Base64加密 最简单的加密方式,甚至可以说不是加密,只是一种用64个字符表示任意二进制数据的方法.Base64编码原理是将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补 ...
- 燕千云 YQCloud 数智化业务服务管理平台 发布1.13版本
2022年6月10日,燕千云 YQCloud 数智化业务服务管理平台发布1.13版本.本次燕千云1.13版本新增了远程桌面.知识库多人在线协作.移动端疫苗核酸信息管理.单据委托代理.技能管理.产品自助 ...
- Do not access Object.prototype method 'hasOwnProperty' from target object
hasOwnProperty 判断对象是否为空 在使用 hasOwnProperty 判断对象是否为空时遇到了一下问题,总结一下 // Do not access Object.prototype m ...
- 【译】Visual Studio 2022 - 17.10 性能增强
我们很高兴地宣布 Visual Studio 2022 的最新更新,它为您带来了 IDE 各个领域的一系列性能增强.在这篇博客中,我们将重点介绍17.10版本中一些最显著的改进,比如更快的 Windo ...