对比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文件: 使用模 ...
随机推荐
- gin 使用 jwt
作用 JWT 的主要作用是方便客戶端與伺服器之間的身份驗證. 使用JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息. 它還可以用於許多其他用途,例如串接多個服務,並將數 ...
- ajax 请求接口实例
通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象.大多数 ...
- LeetCode 685. Redundant Connection II 冗余连接 II (C++/Java)
题目: In this problem, a rooted tree is a directed graph such that, there is exactly one node (the roo ...
- kettle从入门到精通 第三十二课 mysql 数据连接集群/分区配置
1.这里的集群实际上是数据分区或者分片的概念,如中国全国的学生,应该不会都存在一张表里面,有可能每个省市一个表进行存储. 2.集群(分区),如下图所示 设置在"集群"标签,勾选&q ...
- k8s搭建安装 Harbor 私有镜像仓库(本地仓库,内网仓库)
主要参考 https://www.cnblogs.com/wangzy-Zj/p/14011228.html 额外: 1.如果 harbor.yml中的域名和openssl 生成的不一致,你改了hos ...
- C# JAVA UrlEncode
C# JAVA urlencode 默认是不兼容的.C# 需要encode的部分是小写.JAVA 需要encode的部分是大写. /// <summary> /// java UrlEn ...
- nordic的nrf52系列——ADC在使用时如何校准增益误差(基于SDK)
简介:ADC在实际使用的时候都要进行误差校准,那Nordic的nrf52系列如何进行校准,如果不校准又有什么影响尼,接下来我将通过实验进行测试,验证不校准和校准的影响(本测试的基础是,默认输入阻抗和采 ...
- [AGC020D] Min Max Repetition
牛子题 优先满足第二个条件,长度是 \(\lceil \frac{max(A,B)}{min(A,B)+1}\rceil\) ,那么现在要满足字典序最小,发现先填 \(A..ABA..ABA..AB. ...
- 4.4K Star!推荐一款新一代的极简监控系统!轻量高性能!超500个监控指标,颜值高、功能强大!
在信息化快速发展的今天,企业运维面临的挑战日益增多.传统的运维监控系统往往存在功能冗余.性能低下.操作复杂等问题,难以满足现代企业对高效.稳定.智能的运维管理需求. 今天给大家推荐一款新一代极简运维监 ...
- hive第三课:Hive函数学习
Hive函数学习 目录 Hive函数学习 SQL练习 Hive 常用函数 关系运算 数值计算 条件函数(主要使用场景是数据清洗的过程中使用,有些构建表的过程也是需要的) 日期函数重点!!! 字符串函数 ...