38 个回答默认排序
罗幕轻寒
https://www.walterzhu.com
283 人赞同了该回答
上学期计概实验班期末大作业写了两个东西,第一个类似于这个。
其实就是用OpenCV完成的配件相机,大概做了这么一些事情:
效果大概是这样的:(贴到底下)
在这之前没有用过OpenCV,学习过程放在最后。
确实,直接调用OpenCV的人脸检测模块并不很难,但是了解背后的原理的人并不很多。作为一个经典的二十年来一直表现优异的训练-识别算法,AdaBoost背后还是有很多可以学习的思想;其中的一些思想方法,在今天的深度学习人脸检测中仍然得到应用。
1 首先要明确“人脸检测”和“人脸识别”
人脸检测实现的是“这张图里有没有人脸”以及“如果有的话哪里是脸”,而人脸识别做的是“这个人是谁?”。
我的大作业只涉及人脸检测,不涉及人脸识别;从题主的提问来看,应该是要做人脸检测;@
jasonleaster 的代码做的是人脸检测,不是人脸识别。
2 人脸检测的几种方法1.1实在是太过Naive,1.2无法应对千变万化的人脸,解决方法是设置各器官尺寸、位置、角度可变的“弹性模板”,但“弹性”导致计算时间增加,无法实现实时性。
皮肤颜色只是我们为了解决问题方便利用的一个模型,不是人脸的本质特征。易受人种/年龄/光照影响。更矬的是当背景颜色和皮肤颜色很相近时的误判。但这已经是一个比较成熟、得到实际应用的方法。
喜闻乐见,这是一条靠谱的路。其中很有代表性的是Boosting方法。在深度学习一统天下之前的很多年里,他都是表现最好的算法,也是OpenCV采用的人脸检测方法。
3 AdaBoost
AdaBoost是一种算法(解决问题的架构),应用于人脸检测时就需要用到Haar特征(对问题的刻画)。
我们都知道,眼睛跟眼窝相比,眼睛更黑。我们定义一个阈值K,当一张使用(上黑下白)的矩形特征模板进行运算(白色区域的像素和 – 黑色区域的像素和),如果运算的结果>=K时,我们就认为找到了眼睛。
有的人就反对了,凭什么你用一个矩形特征模板运算得到一个结果>=K就算找到眼睛了,万一我这个图像就是一个区域上面是黑的,下面是白的呢?
不要着急,我们再使用第二个矩形特征模板对这块区域进行验证,是不是能增加可靠度呢?如果再用其他的矩形特征模板验证,是不是还可以增加可靠度呢?如果再换个区域,再换个矩形特征模板再验证,是不是还可以增加可靠度呢?
通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。对于一个给定的24*24像素的人脸图像,根据不同的位置,以及不同的缩放,可以产生160,000个特征。
有这么多的特征,我想这个时候的精确度应该已经很高了,但是同时其他问题也出现了——运算速度。
一维的情况下通过预处理前缀和我们可以O(1)查询连续区间和,二维同样,即为积分图(如右下图公式所示)
积分图用于快速求矩形和,在一遍预处理后可以做到O(1)计算,极大的加速了计算过程,是HaarLikeFeature成功应用的关键,可以达到实时的要求(比如自拍相机)
下面展示了我们怎样通过决策树完成决策(有没有人脸?):
下面就是问题的关键:怎样设置Haar特征的排布方式和阈值,使得每一层都有一些非人脸被筛掉?AdaBoost:用一个标注过的样本集训练。
最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好,对弱分类器的孵化就是训练弱分类器成为优化弱分类器,注意这里的优化不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置阈值的过程。
r可以看成是对有序性的衡量(有序才能通过阈值判断)。
在表中寻找r值最小的元素,则该元素作为阈值。有了该阈值,我们就完成了设置,得到了一个优化弱分类器。下面看整个过程中怎么把优化若分类器进行组合
每一轮都把上一轮不能正确判断的样本权重提高,加强薄弱环节。
最后再综合评价每个优化分类器在整个过程中的表现,考察它是不是有保留的价值。
通过“三个臭皮匠顶个诸葛亮”的团结合作精神和民主科学的投票表决我们得到了一个优越的强分类器。
然而在现实的人脸检测中,只靠一个强分类器还是难以保证检测的正确率,这个时候,需要一个豪华的阵容,训练出多个强分类器将它们强强联手,最终形成正确率很高的级联分类器这就是我们最终的目标Haar分类器。
配置的强分类器还是相当局部化的。训练的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测。多尺度检测机制一般有两种策略,一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,完全没有体现出积分图的作用,而另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。
AdaBoost最难处理的两个平衡
算法当年可是压倒性的各种牛逼
4 清楚原理之后再看OpenCV的级联检测每个XML文件里都是训练好的分类器参数,可以直接调用。
5 学习过程C++是本来就会的,入门OpenCV花了半天,理解AdaBoost算法+写讲稿用了半天。写这个例子用了一天(AdaBoost非手写实现),觉得这是一个很有趣的过程。
OpenCV0基础入门不建议看官方文档。可以先看于老师的教程,兼有可靠性、趣味性。跟着实现几个自己的idea之后,可以跟着官方文档探索性学习
这个例子之后,又花一天用OpenCV写了大作业的第二块:授课视频的关键帧识别(PPT切页检测),感觉在实战中进步是最快的。
6 后来
编辑于 2018-01-15
28318 条评论分享
收藏感谢收起
知乎用户
生无所息,行胜于言
33 人赞同了该回答
调用API简单得shi,如果自己完全实现还挺有意思。调用人家OpenCV写好的API,永远不知道什么是人脸识别。
import cv2import numpyface_cascade = cv2.CascadeClassifier("/home/jasonleaster/opencv-3.0.0/data/haarcascades/haarcascade_frontalface_default.xml")#image = cv2.imread("/home/jasonleaster/IMG_20150817_184743.jpg")image = cv2.imread("/home/jasonleaster/positive8.jpg")dst = cv2.resize(image, (300, 300), interpolation = cv2.INTER_CUBIC)gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.2, 5)for (x, y, w, h) in faces: cv2.rectangle(dst, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.imshow('YCM', dst)cv2.waitKey(0)cv2.destroyAllWindows()
问题来了,你会发现,这里调用了一个"神秘文件" xml结尾的。这里面是一堆数据。如果题主阅读过相关论文,不难猜到这里是cascade 针对正人脸的训练好的模型数据。
用了一个API detectMultiScale,接着后面的for循环就开始画绿色的框框了。毕设的深度就在于,你能追究到这个API的实现到什么程度,能不能自己写一个?
(目测没有学校教OpenCV,难道我们学习的东东都要学校教才会么?大大的疑问)
(题主,加油)
编辑于 2016-01-16
3313 条评论分享
收藏感谢收起
Marco Li
35 人赞同了该回答
OPENCV基本强大到人脸识别已经有些内置算法了。。
OPENCV感觉并不需要专门的书。。官方就有一些简易教程。。跟着写一写。。OPENCV自己定义的基本数据结构大概了解了就可以开始做了。。比如什么Mat啊这些。。
计算机视觉入门并不需要《数字图像处理》这本书。那本书是做Image Processing的。。有好些图像变换的东西跟你这个毕设没关系的。。
看看美帝大学计算机视觉课的PPT基本就可以入门了。。比如CS4670/5670: Introduction to Computer Vision, Spring 2015。。像你这个课题。。搞清楚图像怎么存的。。什么是图像特征点。。怎么表达描述图像特征点(就是特征)这些。。
再进一步等你基础概念都弄清楚了。。就是看看论文有没有相关的。。别人是怎么做的。。参考一下(复制一下)。。一些地方做一些改进(换一种方法)基本就差不多了
发布于 2015-12-15
35添加评论分享
收藏感谢
沈一鸣
技能树点的有些乱 工业设计/Coder/图形学/摄影爱好者
251 人赞同了该回答
邪派速成学习法(1周内搞定毕设):
git clone https://github.com/Itseez/opencvcd opencv/samples/cpp
PS: 记得一边看范例一遍查阅API Reference,慢慢往外延伸,尽早尝试动手写自己的程序和试错。
发布于 2016-01-10
25118 条评论分享
收藏感谢
知乎用户
见习高科技算命师傅,欢迎来询,不准不要钱。
25 人赞同了该回答
我也是刚接触opencv,尽力把目前的体会经验答出来吧。
1、IDE跟OpenCV用什么版本其实都关系不大,既然题主已经把vs2015+opencv3环境配置好了,不妨就在此环境下弄好了,时间不值得浪费在纠结在这些地方上,早点安心下手干活的好。
2、
(A)题主说到需不需要“复习”C++,看来题主有C++基础了,那就不用专门拿时间复习C++了,本身OpenCV中保留了大量C语言接口,看起来还挺方便的,实在遇到C++不记得的地方可以找本熟悉的书把相关的地方温习一下好了。
(B)如果只是为了搞定毕设的话,那直接找本像《Learning OpenCV》或者相关cookbook之类的书开撸就好了,找到另一个答案中提到的“那个或那几个”函数并弄明白用法那完全可以搞定你的毕设了。但如果像借着毕设的机会多了解下图像处理跟计算机视觉的东西,不妨就撸一下很多人推荐的冈萨雷斯那本《数字图像处理》吧,不过也不用细看,里面那几章图像增强、图像分割、目标识别的好好看看就行了,其他的地方不用强求。
3、只要马上沉下心来安心搬砖,啥时候开始都来得及。这会开始绰绰有余了,完全够搞定毕设外加好好学学相关的各方面知识。大概的时间安排可以自己看着弄一个,安排出来了就一定要执行,到快毕业那会,酒局就多了,论文就写不动了,还是早点弄完安心的好。
4、视频我没看过,就不作推荐了,不管杂学,早点开始坐下来看代码写代码总不会错的,有了目的驱动碰到问题就会有动力找办法解决问题了。
题主加油,共勉!
发布于 2015-12-15
257 条评论分享
收藏感谢
李十如
带着面具的方便面
9 人赞同了该回答
建议你去看看毛星宇的《opencv3编程入门》,讲解的通俗易懂,而且里面还有大量的样例程序和它的部分注释。我看了这本书以后,感觉对opencv有一个整体上的认识,很适合初学者,而且该可以当做opencv使用手册,特别方便。还涉及到opencv里面一些函数处理图像的算法分析,谅解推荐。对了,里面还有关于安装opencv库的详细步骤。
编辑于 2016-01-25
93 条评论分享
收藏感谢
building
程序员
14 人赞同了该回答
我也是研究了opencv,要做毕业设计。正好研究到了人脸识别。人脸识别是有一个例子程序的。研究发现它识别时要用到一个xml的文件。而且还有可以识别眼睛的。搜索发现。xml里面的是特征码。识别算法就是通过这些特征值来识别的。也就是说理论上只要改变xml里面的值是可以用这个算法识别所有物体的,不仅仅是人脸。所以问题就变成了怎么得到算法能识别的,我们控制的xml。我搜索到了。得到opencv的源码后,用cmake生成一个vs的解决方案,打开后在app的文件夹里有三个项目,其中一个就是用来生成xml的,专业的说法是训练器训练机器,怎么训练自己搜吧,反正挺麻烦的。~我那会儿自己搞的时候没人教。花了差不多一个月才搞清楚整个流程。斗出来就这么几个字。
发布于 2016-01-07
146 条评论分享
收藏感谢
江哈莫夫斯基
Mingguangqiaobei Inst. of Tech.
看两小时官方文档即可
编辑于 2016-01-16
0添加评论分享
收藏感谢
钮圣虓
努力成为会写代码的学术狗、工程狗、产品狗,与vczh这类纯程序猿价值观保持严正对立。
4 人赞同了该回答
呵呵,又是opencv和毕设的“黄金组合”,搞定你的毕设不用这么麻烦,找到“那个或那几个”函数,call一下就好了。
不要问是“哪个或哪几个”,我只能帮你到这了。
发布于 2015-12-15
43 条评论分享
收藏感谢
kimmking
技术人员
2 人赞同了该回答
http://m.blog.csdn.net/article/details?id=26143845
发布于 2016-01-16
2添加评论分享
收藏感谢
sophie
无人机/深度学习/视觉/德语
13 人赞同了该回答
专栏:【OpenCV】入门教程 - 博客频道 - http://CSDN.NET 专栏:【OpenCV】入门教程
可以跟着浅墨大神的博客学习,从原理到实践,很全面,一天一课也不到20天就学完了
发布于 2016-06-05
13添加评论分享
收藏感谢
知乎用户
夯实基础,埋头苦干 happy coding
5 人赞同了该回答
用python去做opencv 很容易 我读研期间做图像这块的 有很快用opencv 的工具做一个停车场车位检测和车牌识别 仅仅是一些内置工具的使用 就可以完成 另外推荐python是因为opencv 在python的借口也很强大 而且上手比较容易
编辑于 2017-02-09
59 条评论分享
收藏感谢
知乎用户
3 人赞同了该回答
讲道理 我们毕业设计有个小伙伴做这个 被老师吐槽了 “这么完善的东西了 为什么还要做 调用opencv的函数并没有什么意义” something like this
-------------------------好了认真回答问题--------------------
看样子题主应该已经做完毕业设计了 大四狗一枚 接触人脸识别不到一个月 说说我的感受
1.线性代数要学好,这个学好不是说会做题,而是真的理解。目前正在认真补数学中(我才不会告诉你们我在看POI呢)
2.多看官方文档,比如说这个Face Recognition with OpenCV,这就表明英语要好,目前也在认真补英语中(我才不会告诉你们我在看POI呢)
3.多看论文,别看国内的论文,别看国内的论文,别看国内的论文,重要的事情说三遍。
编辑于 2016-06-17
36 条评论分享
收藏感谢
童二
/骑行背包摄影爱好者兼职养猪_乒乓球国家二级裁判员/
3 人赞同了该回答
泻药。
上面几位知友回答的可能已经比较详细了,下面说点我的看法。私以为opencv是用起来的,而不是学起来的。所以既然题主已经把环境搭好了,那么找几个博客看看,熟悉下环境。
1:新手入门看看博客,就会有很大的收获了,书本的话,之前看的也是经典的《Learning OpenCV》,不过你的版本是opencv3,毛星云的那本《opencv3编程入门》可能更合适一点(两本都可以),这本书说的还是比较浅(bei)显(ren)易(hei)懂的,虽然对你毕设人脸没有太直接的帮助,但是能帮你更好的理解opencv。vs的话,实验室的伙伴们一直在坚持2008,,挺好。
2:复习c++可能就没必要了,建议直接上手吧,边看边学,这样比较有针对性,可能更容易掌握一点。书的话,刚刚上面说了,如果需要其他相关资料的电子版的, 可以私信我发你邮箱一点(其实也没多少,自己网上找大把的)
3:现在搞毕设还是来得及的,看你想做成什么样的了,建议越早越好,下学期开学除了论文还有各种事情,那时候可能就没心情写论文了,毕业季还是比较伤感的啊哈哈哈,具体的安排还是得你自己根据自身情况制定计划吧
4:opencv的视频教程倒是不多,网搜也是有的,不过视频里面说的内容也是很基础, 不如直接找相关的博客看看,看视频个人觉得进度会比较慢。
不知道你的毕设具体想怎么实现,看你的描述,你可能还是需要了解一点点算法的知识,比如haar、boosting等等,是否还需要训练样本来构造分类器等等,上面你说的都只是关于了解opencv这个工具,但是如何用这个工具来实现你的毕设可能还要在花点心思学点其他知识。
以上,也许对你有点帮助。
cv小白,如有不妥,各位轻喷。
发布于 2015-12-15
3添加评论分享
收藏感谢
嗨谷歌
我写了个脚本7*24问候管理员要的私信
2 人赞同了该回答
三步,
1,上github下载源码
2,运行程序输出结果
3,写论文毕业
发布于 2017-04-24
21 条评论分享
收藏感谢
郭天宇
没读过多少书,没走过多少路。
2 人赞同了该回答
兄弟别用现成的了,好歹用深度学习框架自己搭一个网络试试吧。
比如pytorch或者Tensorflow。
网络模型的话,毕设来个CNN就足够了吧。
编辑于 2017-04-06
22 条评论分享
收藏感谢
Chan.Keh
继续努力
2 人赞同了该回答
《学习OpenCv》
发布于 2015-12-16
23 条评论分享
收藏感谢
Eric Zhang
一个老派的理想主义者
1 人赞同了该回答
一般基于opencv自带的例子,好好研究一下,再根据实际应用情况修改就可以了。最近做的一个瞳孔跟踪检测的demo:
瞳孔跟踪检测
编辑于 2016-03-23
12 条评论分享
收藏感谢
青春
1 人赞同了该回答
Opencv本身已经有训练跟预测的函数了,人脸检测也有。所以你要做的只是call而已。当然,基本的什么二值化,归一化,Mat,IplImage等数据结构的转换搞懂,差不多可以做了。我也就大二……基本是做完了
发布于 2016-03-10
1添加评论分享
收藏感谢
匿名用户
1 人赞同了该回答
如何21天学会c++
发布于 2016-02-06
11 条评论分享
收藏感谢
王诗宇
计算机视觉太难了T_T
1 人赞同了该回答
实现直接调函数就好了,论文上把用的函数算法讲清楚
发布于 2016-01-19
1添加评论分享
收藏感谢
chuen19
1 人赞同了该回答
本人也是毕设现学opencv,只有可怜的C基础,导师给我表情识别的题目。当时就懵逼了,感觉根本做不出来。后来就从C复习起,看了《学习opencv》和各种博客论文,现在已经基本实现预期功能,就差界面搭建了。用心去做,比你想的简单。
对了,想完成毕设参考硕博论文是不错的主意,他们思路清晰,很简单。对于某一点理论不懂就搜论文就可以了。
发布于 2016-01-10
16 条评论分享
收藏感谢
小灰灰
just do IT
1 人赞同了该回答
毕设的话,前期应该不需要考虑性能和精确的准确度,那么人脸检测的话只需要两步,加载级联分类器和检测,在opencv中都有相应的api函数。
简单的人脸检测题主可以参考这个:级联分类器
编辑于 2015-12-15
1添加评论分享
收藏感谢
知乎用户
一流厨师,二流程序员,三流设计师,会泡茶,擅长洗碗,偶尔装逼。
1 人赞同了该回答
从0开始?必须从理论开始啊,我看的是数字图像处理,那本绿绿的厚厚的书。没有理论你连opencv的api都看不懂。
opencv支持其他语言,我当初用的是Java,c++的api文档最好,java的很一般。
我课程作业做的是类似谷歌的图片搜索那种,用了两周。代码都自己写,opencv只是被我拿来将jpg转成矩阵而已,算法都自己写。我课程也只是学基础,做图片搜索只是感兴趣然后自己上知网搜论文看论文,看了一个星期论文吧。
你也可以去抄代码,网上很多的,但是毕设检查肯定会问你理论,所以基础和实现原理必须了解。
理论基础起码两三个星期吧,一个星期论文两个星期代码,一个多月应该可以。
发布于 2016-02-14
14 条评论分享
收藏感谢
王谭
哈哈
如何只是调用opencv训练好的分离器和函数,还是挺容易的!详细内容可以关注我的微信公众号
专注自学互联网运营的小白,入门“人工智障”
发布于 2018-03-08
0添加评论分享
收藏感谢
白白
程序员
最快的话,可以选择opencv里面自带的分类器,想玩点东西的可以从肤色检测里面下手
编辑于 2017-07-28
0添加评论分享
收藏感谢
冰不语
公众号【CVPy】分享OpenCV的一些有意思的东西
首先学习OpenCV基础,可以参考官方文档或者浅墨大神的博客。然后参考以下博客系列:
编辑于 2017-03-30
0添加评论分享
收藏感谢
匿名用户
opencv似乎自带人脸识别的功能的吧。不过如果想自己做的话大概可以看看机器学习什么的吧。。?
发布于 2017-03-29
0添加评论分享
收藏感谢
知乎用户
一介码农
按照我的理解 目前大多数人脸特征点算法都是先通过人脸检测找到图像中人脸区域 然后进行特征点定位的 所以题主说通过人脸特征点提取来检测人脸区域似乎不太可行 毕竟人脸区域检测是比人脸特征点提取简单得多的任务 :)
当然也有一些人脸特征点和人脸区域检测同时进行的算法 具体可以翻翻这两年CVPR ECCV的文章
编辑于 2017-02-03
0添加评论分享
收藏感谢
钱令军
工程师 图像算法 机器视觉
没必要复习那么多吧,直接拿opencv的资料学习,边做边学,解决问题中把该学的都学了。网上资料还是挺多的,可以去参考一下,这个人脸检测还是很多成熟代码的吧
编辑于 2016-12-19
0添加评论分享
收藏感谢
嗯嘛
动漫非宅/计算机视觉/AI/智能嵌入式
直接搜索 OpenCV Face Detection,20多行的代码就能实现人脸检测了。
如果真的想在毕设中学点东西,这个题目并不一定合适。
当然,如果你自己搜集人脸图片,自己train model然后实现image pyramid的话,还是有些意义。
发布于 2016-12-05
0添加评论分享
收藏感谢
专治高级喷子
极度排斥某宗教。
人脸识别,就先别接触opencv的人脸库了,太容易调用了,半个小时就能搞个所谓的人脸识别,想要做产品,还是先从基础来,多去研究祖传的几种人脸识别算法。
编辑于 2016-04-18
04 条评论分享
收藏感谢
able
把学习opencv的前几章看看,然后再找专门的人脸识别算法实现
发布于 2016-03-22
0添加评论分享
收藏感谢
陈乐天
弗吉尼亚理工大学 计算机系博士在读
Python,Java, Cpp分别在Windows, Mac 和Ubuntu下都测过,个人感受可用性最高的是Ubuntu+Cpp
编辑于 2016-03-14
0添加评论分享
收藏感谢
Johnnie
openCV只是一个库,就是一堆现成的函数,只管调用就可以,关键是先把C++学好
发布于 2016-02-05
0添加评论分享
收藏感谢
呵呵鸡
没有什么干货的苦逼
如果是本科毕设,真不用这么麻烦。
如果有C++基础最好,没有也无所谓,有点编程基础就行,openCV很多封装好的库函数,直接调用就行了。找点关于openCV的书,看看函数都是怎么调用的就行了。视频个人感觉没有必要。
不懂的地方,建议可以去看看别人的技术博客或者论坛~
应付本科毕设,足够了~
发布于 2016-01-10
01 条评论分享
收藏感谢
知乎用户
去年11月看到这个问题,因为毕设要做的也是这个(人脸检测+人脸识别+人脸跟踪)。如今答辩结束,特来回答一下这个问题。
方案设计方案设计编程语言的选择OpenCV支持多种编程语言,如C++、Python、Java等,只要选择自己擅长的就行了,如果你不擅长任何一门,建议学习Python。答主使用的是Python3。
系统设计系统设计人脸检测设计需要了解Haar特征的概念,快速计算Haar特征值的方法(积分图),以及理解Haar级联分类器是如何工作的。参考资料:
人脸识别设计需要了解LBP算子以及理解LBPH算法。参考资料:
人脸跟踪设计OpenCV提供了目标跟踪的相关算法,但答主为了省事直接调用Dlib库来实现。Dlib是一个跨平台的C++工具包,封装实现了大量与机器学习跟图像处理有关的算法。如果你想进一步了解,请访问Dlib的官网:
dlib C++ Library 图形用户界面设计需要学习QT,参考资料:
发布于 2018-05-09
0添加评论分享
收藏感谢收起
知乎用户
程序猿
之前本人做过一个识别身份证号码的,我用的是Python,好像是opencv2吧(记不清了)。最后实现了,代码才不到一百行,调几个opencv的函数就可以了。但我建议用c++版本的,这个版本的网上资源多,可以去参考。IDE而言好像都差不多吧,尽量避免用VS,太占资源了。想赶进度,需要有c++基础,不然很难,毕竟opencv只是一个函数库
编辑于 2016-03-14