对比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某质量检测中心系统 崩溃分析
一:背景 1. 讲故事 这些天有点意思,遇到的几个程序故障都是和Windows操作系统或者第三方组件有关系,真的有点无语,今天就带给大家一例 IIS 相关的与大家分享,这是一家国企的.NET程序,出现 ...
- webpack 路径别名与导入后缀省略
// 解析模块的规则 resolve: { // 配置解析模块路径别名:优点简写路径,缺点路径没有提示 alias: { // 定义一个@变量,可在import引入时使用 '@': path.reso ...
- The model backing the 'MainDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
The model backing the 'MainDbContext' context has changed since the database was created. Consider u ...
- 动态生成的 select option 无法选中,设置值
使用jQuery的 .val('22') 给select 设置值时不生效. 原因:select是动态生成的,在DOM还没生成完之前就调用了.val('22'). 解决方法:动态生成的ajax请求改成同 ...
- ChatGPT应用与实践初探
近期,长江商学院EMBA38期&甄知科技开展了题为"ChatGPT应用与实践初探"的线下沙龙活动,由上海甄知科技创始合伙人兼CTO张礼军主讲,主要给大家解密最近很火的Cha ...
- mysql分组求最大ID记录行方法
##创建表 CREATE TABLE `test_user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `order_no` BIGINT(20) DEFAULT ...
- CAT监控指标
CAT监控指标 CAT 是基于 Java 开发的实时应用监控平台.官方文档:https://github.com/dianping/cat CAT提供以下几种报表:Transaction报表 一段代码 ...
- 高级前端开发需要知道的 25 个 JavaScript 单行代码
1. 不使用临时变量来交换变量的值 例如我们想要将 a 于 b 的值交换 let a = 1, b = 2; // 交换值 [a, b] = [b, a]; // 结果: a = 2, b = 1 这 ...
- Luban小试牛刀
Luban小试牛刀 LubanUnity LubanUnity配置工具配置解决方案 简介 Github 文档 视频教程 Unity工具 个人感觉挺强大,便捷的,适合中大型游戏项目的配置工作.小 ...
- Operational Property Graphs到底是个啥?
Operational Property Graphs,中文通常译为"操作属性图". 作为23ai中被官方highlight出的新特性之一,我们先看下官方的原文描述: Operat ...