MFC结合OpenCV实现的人脸识别程序

版权申诉
0 下载量 133 浏览量 更新于2024-10-14 1 收藏 2.88MB RAR 举报
资源摘要信息: 该文件"SDI_OpenCV.rar"包含了一个人脸识别系统的源代码,它是基于MFC(Microsoft Foundation Classes)和OpenCV(Open Source Computer Vision Library)开发的。人脸识别技术是一种可以通过计算机分析来识别人脸的技术。在这个程序中,OpenCV库提供了处理图像和人脸检测所需的各种算法和工具,而MFC则提供了一个易于使用的图形用户界面(GUI)框架,以便用户能够与程序进行交互。 ### 详细知识点说明: 1. **MFC(Microsoft Foundation Classes)**: MFC是一个C++库,用于开发Windows应用程序。它封装了Windows API(应用程序编程接口),提供了一套面向对象的编程接口。MFC允许开发者以面向对象的方式快速开发Windows应用程序,特别适合开发具有复杂用户界面的应用程序。在本程序中,MFC用于创建和管理用户界面,包括窗口、对话框、按钮等GUI元素,以及处理用户的输入事件。 2. **OpenCV(Open Source Computer Vision Library)**: OpenCV是一个开源的计算机视觉和机器学习软件库。它提供了大量的图像处理和计算机视觉方面的算法,支持实时应用。OpenCV库广泛应用于学术研究、工业应用和产品开发中。它包括了从初级的图像处理操作(如滤波、形态学操作、颜色空间转换等)到高级功能(如特征检测、物体识别、面部识别等)的算法。 3. **人脸识别技术**: 人脸识别技术是指利用计算机技术从图像或视频中识别出人脸的技术。它通常包括人脸检测、特征提取、人脸比对等步骤。人脸检测是从图像中找到人脸所在的位置,特征提取是从检测到的人脸中提取关键信息(如眼睛、鼻子、嘴巴的位置和形状等),人脸比对则是将提取的特征与数据库中已知人脸的特征进行比较,以识别出该人脸的身份。 4. **人脸检测**: 人脸检测是人脸识别的第一步,它的目的是在给定的图像或视频中定位人脸的位置,并将人脸从背景中分离出来。在OpenCV中,人脸检测通常可以通过Haar特征分类器或深度学习模型来实现。Haar特征分类器是一种基于机器学习的方法,可以训练出一个模型来识别图像中的特定模式(如人脸)。深度学习模型则使用神经网络来自动学习人脸的特征,这通常能够提供更高的准确性。 5. **特征提取与人脸识别**: 特征提取是在人脸检测的基础上进一步处理,提取出用于区分不同人脸的特征点或特征向量。OpenCV提供了多种算法来进行特征提取,如Eigenfaces、Fisherfaces、LBPH(局部二值模式直方图)等。这些算法能够通过数学建模将人脸图像转换成一组数值特征,然后使用这些特征进行人脸的识别和比对。 6. **MFC与OpenCV结合使用**: 在本程序中,MFC与OpenCV结合使用意味着开发者利用MFC构建了一个图形用户界面,并在该界面上嵌入了OpenCV进行图像处理和人脸识别的功能。用户可以通过MFC界面上传图片或视频,程序调用OpenCV中的相关函数来处理图像数据,进行人脸检测和识别,最终将结果反馈到MFC界面供用户查看。 ### 知识点总结: - 程序是一个结合了MFC和OpenCV技术的人脸识别应用。 - MFC用于构建GUI,管理用户的操作界面和事件。 - OpenCV提供了强大的图像处理和计算机视觉算法。 - 人脸识别涉及人脸检测、特征提取和人脸比对等步骤。 - OpenCV中实现人脸检测的常见方法包括Haar特征分类器和深度学习模型。 - 特征提取算法如Eigenfaces、Fisherfaces、LBPH等能够提高人脸识别的准确度。 - 程序的用户通过MFC界面与系统交互,系统通过OpenCV处理图像并给出识别结果。

改变通道数,代码如何修改public static String[] multiPlateRecognise(opencv_core.Mat mat) { PlateDetect plateDetect = new PlateDetect(); plateDetect.setPDLifemode(true); Vector<opencv_core.Mat> matVector = new Vector<opencv_core.Mat>(10); if (0 == plateDetect.plateDetect(mat, matVector)) { if (matVector.size() > 0) { //字符分割与识别 return new String[]{cr.charsRecognise(matVector.get(0))}; } } return null;public static void main(String[] args) { // 多张车牌图片路径 String[] imgPaths = {"res/image/test_image/plate_locate.jpg", "res/image/test_image/test.jpg", "res/image/test_image/plate_detect.jpg", "res/general_test/京A88731.jpg"}; int sum = imgPaths.length; // 总共处理的图片数量 int errNum = 0; // 识别错误的数量 int sumTime = 0; // 总耗时 long longTime = 0; // 最长处理时长 for (int i = 0; i < sum; i++) { opencv_core.Mat src = opencv_imgcodecs.imread(imgPaths[i]); String[] ret = multiPlateRecognise(src); long now = System.currentTimeMillis(); System.err.println(Arrays.toString(ret)); long s = System.currentTimeMillis() - now; if (s > longTime) { longTime = s; } sumTime += s; boolean flag =false;//是否有一个车牌号识别错误 for (String plate:ret) { if (plate == null) { continue; } String targetPlate = getTargetPlate(imgPaths[i]); if (!plate.equals(targetPlate)){ flag = true; break; } } if (flag) { errNum++; } } BigDecimal errSum = new BigDecimal(errNum); BigDecimal sumNum = new BigDecimal(sum); BigDecimal c = sumNum.subtract(errSum).divide(sumNum,2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); System.err.println("总耗时:" + sumTime + "ms,平均处理时长:" + sumTime/sum + "ms,错误数量:" + errNum + ",正确识别率:" + c + "%"); } }

2023-06-11 上传