对比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文件: 使用模 ...
随机推荐
- Linux signal()函数
这是在网易云课堂学习Linux下的signal()函数的笔记,课程链接:https://study.163.com/course/courseLearn.htm?courseId=1002913011 ...
- 鸿蒙HarmonyOS实战-ArkTS语言基础类库(容器类库)
前言 容器类库是指一组用于存储和管理数据的数据结构和算法.它们提供了各种不同类型的容器,如数组.链表.树.图等,以及相关的操作和功能,如查找.插入.删除.排序等. 容器类库还可以包含其他数据结构和算法 ...
- FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
FlashDuty:一站式告警响应平台,前往此地址免费体验! FlashDuty 现在已经全面支持了深色模式,这为您提供了更柔和的光线和舒适的界面外观.并且,您可以根据自己的喜好和使用环境动态切换深色 ...
- ssh进阶
1.ssh客户端工具 查看参数和帮助方法 ==ssh --help== ==man ssh== 常见参数 windows linux macos 提供的ssh命令,会有些区别,查看帮助后使用即可. l ...
- Vue学习:5.v-bind使用
第一节算是对v-bind的粗略了解,仅仅是列举了v-bind的使用.这一节将更详细的了解v-bind的具体用法. v-bind是 Vue.js 中常用的指令之一,用于动态地绑定属性或者表达式到 HTM ...
- http与https详解
1.http HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准.HTTP是一个基于TC ...
- el-upload拍照上传多个文件报错 ERR_UPLOAD_FILE_CHANGED问题
最近同事使用el-upload上传图片时出现一个问题,连续拍照多个图片的时候,循环调用接口上传会报错: ERR_UPLOAD_FILE_CHANGED,网上找了很多方案没有解决,下面是我自己的解决过程 ...
- 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU
为了更好的阅读体验,请点击这里 由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细. 5.1 层和块 事实证明,研究讨论"比单个层大"但"比整个模型小&quo ...
- 如何在Zynq-7000上烧写PL Image
由 技术编辑archive1 于 星期六, 06/28/2014 - 10:05 发表 作者:hqin, Xilinx处理器专家FAE 在Zynq-7000上编程PL大致有3种方法: 用FSBL,将b ...
- 三屏异显案例分享,基于全国产RK3568J工业平台!
在工业领域中,能否更灵活.更高效地在主屏幕进行主要任务,并在其他副屏幕上进行其他次要任务(例如查看参考资料.监控其他应用程序),一直都是许多工业领域客户面临的刚需,而"多屏异显"功 ...