OpenCV学习笔记[3]Java Demo人脸识别

这篇博客介绍了使用OpenCV进行人脸识别的Java Demo,通过官方示例展示如何检测图像中的人脸位置。程序能够实现高识别率,但也存在误识别的情况,如将耳朵识别为人脸。作者希望未来能深入学习匹配模式设定,并解决在Java项目中直接引用文件路径带来的问题。
摘要由CSDN通过智能技术生成

OpenCV学习笔记:Java Demo人脸识别


[简介]

        我记得在很久以前,CSDN似乎搞过一个活动,给一个橘子林的照片,让程序计算相片里有多少个橘子。之所以对这个问题记忆犹新,是因为在专业学习初期,相比于排序遍历搜索等简单算法而言,“图像识别”算法一直是难以理解的东西,而我偏偏又痴迷于此,不管自己多么无知,对于令我迷惑的问题总是充满着解决的渴望。

        通过对OpenCV的初步了解,我发现图像识别的很多问题都可以用它方便的解决,本次将是一个来自官方的人脸识别的实例,我们提供图像,使用内置的匹配模式与算法,得到图像中的人脸位置,这与在腾讯空间中流行的图片识别过程类似。


[实例:人脸识别]

英文原版程序可以在这里找到,注意修改版本号和文件路径:opencv.org

项目目录结构如下:


我没有采用原版中直接按照类的包格式进行资源的引用,而是创建了Data与Result两个目录用来存放原与结果,这样输出更方便一些。

lbpcascade_frontalface.xml可以从OpenCV库的解压路径下sources\data\lbpcascades找到。

CVMain.java:

public class CVMain {
	public static void main(String[] args) throws InterruptedException {
		System.loadLibrary("opencv_java249");
		new FaceDetector().run();
	}
}
FaceDetector:

public class FaceDetector {
	public void run(){
		CascadeClassifier faceDetector = new CascadeClassifier("./Data/lbpcascade_frontalface.xml");
		Mat image = Highgui.imread("./Data/haha.jpg");
		MatOfRect faceDetections = new MatOfRect();
		faceDetector.detectMultiScale(image, faceDetections);

		System.out.println(String.format("Detected %s faces",
				faceDetections.toArray().length));
		for (Rect rect : faceDetections.toArray()) {
			Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
					+ rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
		}

		String filename = "./Result/FaceDetect.png";
		System.out.println(String.format("Writing %s", filename));
		Highgui.imwrite(filename, image);
	}
}

我输入的图片:


程序输出结果:


↑对于完整的人脸,识别率非常高,但有时也会出现意外,例如上图中史密斯先生的耳朵被识别为一张脸(放大一看确实有点像人脸),大家有兴趣可以拿自己毕业照之类的合照来测试一下。


[总结]

        这个问题解决的很方便,我们没有触及任何识别算法的事情,只是给出图片、获得结果这样直截了当。我希望以后至少能够掌握匹配模式设定的一些知识,尝试使用这套结构去解决先前数橘子的问题。

        还有一个值得注意到的问题,OpenCV的API似乎直接从文件路径进行的支持,按照Java开发的原则,流封装应该优先于文件,如果直接对文件路径进行封装,那么将项目打包后对jar中资源的引用将会非常麻烦(但从jar包中获得流资源却非常容易)。这个问题以后还要持续关注。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值