基于 C++ 和 OpenCV 相结合的猫脸识别

498 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

介绍

现今,互联网主要围绕人工智能、大数据、虚拟现实等展开,这些都是当今的热词,是大势所趋,而图像识别技术就是人工智能的一个重要领域。图像识别技术指的是对计算机读取的图片进行“扫描”,从而对图片信息进行分析和理解,以识别各种不同状态下的对象,通过先对图信息进行采集,然后对图像进行最初的处理、分析,最后进行图像识别,从而达到目的。图像识别技术是在地图导航、自然资源、天气预报、环境监测、生理病变等许多方面有着重要的应用价值,目前,图像识别技术在工业、医疗、农业等领域已经得到了广泛的应用。图像识别可通过 C++、OpenCV、Python、php 等技术来实现,相比较之下,C++ 和 OpenCV 的结合会带来全新面貌。C++ 是一门简单易学、用途广泛、功能强大的语言,具有移植性好、扩展性强、面向对象等优点。OpenCV 是一个跨平台的计算机视觉库,能够对图片、视频等进行处理,拥有和 ps 一样的功能,它轻量但是高效,并且提供了 Python、C++、Matlab等编程语言的接口,只需引用一下,就能实现有关图像处理的很多算法。OpenCV 已运用于图像分割、物体识别、人机交互等多个方面。两者通过少量的代码结合在一起,清晰、易懂的实现图像识别功能,极大的提高了开发效率。本文就是利用 C++ 和 OpenCV技术来进行宠物猫脸识别的研究。

开发环境配置

先去官网下载适合自己计算机的 opencv 版本和vistual studio 版本,这里安装的是 opencv-4.1.1 版本和 VS2017 版 本, 然 后 配 置 OpenCV 环 境 变 量 和 在VS2017 里配置 Opencv4.0。注意:运行的时候 vs2017这里要选择 Debug x64。

opencv 训练分类器制作 xml 文件

在 OpenCV 的代码仓库保存着很多已经训练好的Haar 分类器,如检测各种物体、面部,眼睛,微笑等,这些 XML 文件保存在 /opencv/data/haarcascades/ 文件夹中。在 haarcascades 目录里,你会发现两个检测猫脸的 xml 文件(如图 1 所示)。这些 cascades 分类器是由 Joseph Howse 训练和贡献给 OpenCV 仓库的,他写了很多非常好的教程和书籍,在计算机视觉领域有着很高的声望。

创建样本

训练样本分为正样本和反样本,其中正样本都是需检测物品的图片,尽量选背景色单一的。负样本可以是其他的除了需检测物品的图片。样本数量越多训练出的结果越好,负样本一般是正样本的 3~5 倍。正样本描述形如 xxx.jpg 1 0 0 20 20,1 代表一张图片,00 代表图片的起始点,一般都用 0 0 表示,20 20 代表图片的长、宽。负样本描述只需要图片的名称就可以了,以 txt 形式保存下来。

训练分类器 

将正样本描述文件转换成 vec 文件:在 cmd 命令中输入 opencv_createsamples.exe -vec zh.vec -info zh.txt-num 50 -w 20 -h 20,zh.vec 指的是生成名字为 zh 的vec 文件,zh.txt 指的是正样本的描述文件,-num 50代表是正样本图片的个数,-w 20 -h 20 表示的是图片的长、宽。运行命令后,会在文件夹下生成 zh.vec文件。训练生成 xml 文件:在 cmd 命令中输入 opencv_haartraining.exe -data xml -vec zh.vec -bg fu.txt -nstages5 -nsplits 2 -npos100 -nneg 300 -w 20 -h 20,xml 是生成的文件类型,zh.vec 就是前面生成的 vec 文件,fu.txt 指的是负样本的描述文件,-npos 100 指的是正样本图片有 100 个,-nneg 300 指的是负样本图片有300 个,-w 20 -h 20 代表正样本的长、宽,-w 和 -h是不能缺少的条件,否则会报错。当命令运行完后,会生成一个 xml 文件夹和一个 xml.xml 文件。

图像识别

当生成 xml 文件后,则就能根据 xml 文件中的数据来识别图片中的脸。代码如图 4 所示,先获取图片以及训练参数的路径,使用自身函数 imread()读取图片,channels 用来判断图片是否为灰度,当值不为3 时,表示该图片是灰度图,若该图片不是灰度图,则使用 cvtColor(img, imgGray, CV_RGB2GRAY),将图片转换成灰度图,主要是灰度图像操作速度较快。调用 detectMultiScale()函数进行检测,它能返回包含对象的矩形框,我们只需标注出来,就能清晰的进行下一步图片比对工作。该函数下的 minNeighbors、minSize 等参数的设置,都会影响到最终能否从图片中识别到猫的脸。若识别到图片中有猫的脸,则把它框出来。

图像检索感知哈希算法原理

网络时代 , 图像搜索技术越来越火爆 , 相似图像搜索的哈希算法有均值哈希算法、差值哈希算法和感知哈希算法。本文采用的是感知哈希算法,它是哈希算法的一类,主要用于相似图片的搜索。它是对每张图片生成一个指纹字符串,通过对该字符串比较可以判断图像间的相似度。本例当识别到图像中有猫的脸,将使用感知哈希算法,这个算法的原理是将图片转换为灰度图像,接着将图像的大小调整为 32*32 像素,然后通过 DCT 变换,取左上角的 8*8 像素区域。再计算这 64 个像素的灰度值的均值。将每个像素的灰度值与均值对比,大于均值记为 1,小于均值记为 0,得到 64 位哈希值。 在图中对比 cat.jpg 与各个不同图像,看看 64 位中有多少位是不一样的。在理论上,这等同于计算“汉明距离”,以此衡量两图之间的额相似度。计算两张图像的汉明距离,实则就是计算长度,长度越大,则图片越不相似,长度越小,则图片越相似。如果不相同的数据位不超过 5,就说明两张图片很相似;如果大于 10,就说明这是两张不同的图片。各个图像与 cat.jpg 的汉明距离,从中可以看出 cat1.jpg 和 cat.jpg 非常相似。这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。