基于QT+OpenCV的人脸识别-米尔iMX8M Plus开发板的项目应用
2022-05-18
1153
来源:米尔电子
本篇测评由电子工程世界的优秀测评者“流行科技”提供。
此次测试的开源项目,是基于QT+OpenCV的人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改,让其运行在米尔iMX8M Plus开发板上。
测试项目实际是分了两个工程,一个工程是作为管理员控制功能使用,添加人脸信息。同时也可以查询到打卡记录,对从机进行下发通知等等。
人脸识别我们主要需要用到opencv的人脸检测分类器。
OpenCV编译完成后已经提供好了的。
因为这里还需要涉及到训练模型,有了模型后才能更好地识别,所以还是简单介绍下怎么训练的吧。
CascadeClassifier cascada;
//将opencv官方训练好的人脸识别分类器拷贝到自己的工程目录中
cascada.load("F:videoccchaarcascade_frontalface_alt2.xml");
VideoCapture cap(1); //0表示电脑自带的,如果用一个外接摄像头,将0变成1
Mat frame, myFace;
int pic_num = 1;
while (1) {
//摄像头读图像
cap >> frame;
vector<Rect> faces;//vector容器存检测到的faces
Mat frame_gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转灰度化,减少运算
cascada.detectMultiScale(frame_gray, faces, 1.1, 4, CV_HAAR_DO_ROUGH_SEARCH, Size(70, 70), Size(1000, 1000));
printf("检测到人脸个数:%dn", faces.size());
//识别到的脸用矩形圈出
for (int i = 0; i < faces.size(); i++)
{
rectangle(frame, faces, Scalar(255, 0, 0), 2, 8, 0);
}
//当只有一个人脸时,开始拍照
if (faces.size() == 1)
{
Mat faceROI = frame_gray(faces[0]);//在灰度图中将圈出的脸所在区域裁剪出
//cout << faces[0].x << endl;//测试下face[0].x
resize(faceROI, myFace, Size(92, 112));//将兴趣域size为92*112
putText(frame, to_string(pic_num), faces[0].tl(), 3, 1.2, (0, 0, 225), 2, 0);//在 faces[0].tl()的左上角上面写序号
string filename = format("F:video%d.jpg", pic_num); //图片的存放位置,frmat的用法跟QString差不多
imwrite(filename, myFace);//存在当前目录下
imshow(filename, myFace);//显示下size后的脸
waitKey(500);//等待500us
destroyWindow(filename);//:销毁指定的窗口
pic_num++;//序号加1
if (pic_num == 11)
{
return 0;//当序号为11时退出循环,一共拍10张照片
}
}
int c = waitKey(10);
if ((char)c == 27) { break; } //10us内输入esc则退出循环
imshow("frame", frame);//显示视频流
waitKey(100);//等待100us
}
return 0;
通过上面的代码,完成图像采集。
//读取你的CSV文件路径.
//string fn_csv = string(argv[1]);
string fn_csv = "F:videocccat.txt";
// 2个容器来存放图像数据和对应的标签
vector<Mat> images;
vector<int> labels;
// 读取数据. 如果文件不合法就会出错
// 输入的文件名已经有了.
try
{
read_csv(fn_csv, images, labels); //从csv文件中批量读取训练数据
}
catch (cv::Exception& e)
{
cerr << "Error opening file "" << fn_csv << "". Reason: " << e.msg << endl;
// 文件有问题,我们啥也做不了了,退出了
exit(1);
}
// 如果没有读取到足够图片,也退出.
if (images.size() <= 1) {
string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
for (int i = 0; i < images.size(); i++)
{
//cout<<images.size();
if (images.size() != Size(92, 112))
{
cout << i << endl;
cout << images.size() << endl;
}
}
// 下面的几行代码仅仅是从你的数据集中移除最后一张图片,作为测试图片
//[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
images.pop_back();//删除最后一张照片,此照片作为测试图片
labels.pop_back();//删除最有一张照片的labels
// 下面几行创建了一个特征脸模型用于人脸识别,
// 通过CSV文件读取的图像和标签训练它。
// T这里是一个完整的PCA变换
//如果你只想保留10个主成分,使用如下代码
// cv::createEigenFaceRecognizer(10);
//
// 如果你还希望使用置信度阈值来初始化,使用以下语句:
// cv::createEigenFaceRecognizer(10, 123.0);
//
// 如果你使用所有特征并且使用一个阈值,使用以下语句:
// cv::createEigenFaceRecognizer(0, 123.0);
//创建一个PCA人脸分类器,暂时命名为model吧,创建完成后
//调用其中的成员函数train()来完成分类器的训练
Ptr<face::BasicFaceRecognizer> model = face::EigenFaceRecognizer::create();
model->train(images, labels);
model->save("MyFacePCAModel.xml");//保存路径可自己设置,但注意用“”
Ptr<face::BasicFaceRecognizer> model1 = face::FisherFaceRecognizer::create();
model1->train(images, labels);
model1->save("MyFaceFisherModel.xml");
Ptr<face::LBPHFaceRecognizer> model2 = face::LBPHFaceRecognizer::create();
model2->train(images, labels);
model2->save("MyFaceLBPHModel.xml");
// 下面对测试图像进行预测,predictedLabel是预测标签结果
//注意predict()入口参数必须为单通道灰度图像,如果图像类型不符,需要先进行转换
//predict()函数返回一个整形变量作为识别标签
int predictedLabel = model->predict(testSample);//加载分类器
int predictedLabel1 = model1->predict(testSample);
int predictedLabel2 = model2->predict(testSample);
// 还有一种调用方式,可以获取结果同时得到阈值:
// int predictedLabel = -1;
// double confidence = 0.0;
// model->predict(testSample, predictedLabel, confidence);
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
string result_message1 = format("Predicted class = %d / Actual class = %d.", predictedLabel1, testLabel);
string result_message2 = format("Predicted class = %d / Actual class = %d.", predictedLabel2, testLabel);
cout << result_message << endl;
cout << result_message1 << endl;
cout << result_message2 << endl;
getchar();
//waitKey(0);
return 0;
通过上面的代码进行训练,训练使用了python。所以系统环境需要配置好。
在此文件中,把我们采集到的图像,放进去,新建一个文件夹。
之后就是把我们的at.txt也加入我们的文件。
训练好后,我们就得到了我们所需要的训练文件。
在我们打卡界面,点击打卡时就是这样的。加载训练好的东西。然后启动定时器,去获取摄像头信号,然后对比,最终和数据库一致就认为打卡成功。
上面训练部分,其实提供的另一个工程就全部完成了。
这是我们win端界面,圆框就是我们摄像头采集图像显示的位置。
我们需要在Ubuntu下把库全部替换,这样就能编译过了,然后拷贝到开发板上运行。如下:
进来就提示数据库打开失败了,我们这个都是基于数据库,所以还是比较尴尬的,后期的话可以尝试自己全部编译下,然后更新吧。目前就测试,看下效果吧。
使用的硬件增加了一个摄像头。
这是打开摄像头采集的样子。
这个GIF展示了我们的人脸检测情况。
由于没有数据库,只能打印一些信息。当两个数据相等时就进入下一步,判断打卡了。由于没有数据库,就展示下电脑端的效果吧。
想要了解优秀测评者“流行科技”关于MYD-J8MPQC开发板测评原文的可以复制下方链接查看:
//bbs.eeworld.com.cn/thread-1199387-1-1.html
2023-02-17
嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
本篇测评由电子发烧友的优秀测评者“ALSET”提供。电子发烧友网发布了一款试用产品:米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6UL L处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。01.什么是ncnnncnn 是腾讯优图推出的在手机端极致优化的高性能神经网
2022-11-24
FPGA+MPU+MCU三芯合一!米尔全自动血细胞分析仪解决方案
全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备,功能齐全,操作简单,依托相关计算机系统在数据处理和数据分析等方面具有出色表现,可同时进行多个参数的可靠分析,通过联网互通和交互式触摸屏可以实现线上信息共享等功能,被广泛应用在医院临床检验中
2022-10-18
基于Zynq-7000高速数据采集解决方案—米尔MYD-C7Z010/20-V2开发板
近年来,科技日新月异,随着机器视觉、人工智能的迅速发展,相关行业对数据采集系统的性能要求更加苛刻,要求能够同时采样的通道更多,采样的精度和速度要求更高。在雷达,航天,视频传输,工业控制等领域,采样率、分辨率、传输速率成为评价超高速数据采集系统的最重要技术指标,所以芯片的选择就变得尤为重要,既需要具备高精度、高采样速率等模块,又需要可以嵌入操作便捷、用户体验更友好的操作系统,实现良好的人机交互功能。
2022-08-26
开发环境篇:Linux C按键控制LED--米尔MYD-YT507H开发板
本篇测评由电子工程世界的优秀测评者“qinyunti”提供。此次板卡的测试,是Linux C开发环境下按键控制LED的操作实录。前言对于核心板或者开发板的选型我们一样会考虑二次开发的便捷性,开发环境,手册等的易用性和完整性。下面我们就从开发者的角度体验,从Linux C开发,Qt开发,python开发等常见开发入手进行体验。现在开始第一部分Linux C开发环境的简单体验。准备串口登录丝印Debu
2022-08-22
第一视角体验国产处理器全志T507-H开发板
现在车规级芯片市场潜力巨大,需求旺盛,芯片都在逐渐走向国产化。本期要介绍的主角是米尔基于全志T507-H的MYD-YT507H开发板,是米尔结合国产工业级平台CPU:全志T507-H芯片研制的CPU模组,集成了四核Cortex-A53的CPU和G31MP2的GPU,具有强大的图像处理功能,并拥有多路视频输入和输出的接口。
2022-08-05
米尔的国产T507-H开发板怎么玩?macOS如何将Ubuntu系统烧录到eMMC的完全调教指南!
本篇测评由电子发烧友的优秀测评者“HonestQiao”提供。此次板卡的测试,是用macOS将Ubuntu系统烧录到eMMC的操作实录。米尔MYD-YT507H开发板,官方提供了HMI系统和Ubuntu18.04镜像,体验过默认的HMI系统后,我就换上了我喜欢的Ubuntu系统了。一、系统烧录参考官方的文档,使用全志的图形界面烧录工具,在Windows下烧录简单又方便:因为我使用的是macOS系统
2022-07-15
如何实现异构处理器间相互通讯——米尔带您玩转i.MX 8M Plus开发板
本篇测评由电子工程世界的优秀测评者“bloong”提供。此次测试的项目,是异构处理器间相互通讯项目。MYD-JX8MPQ配备了一颗异构的Cortex-M7协处理器,可以同时运行Linux和RTOS。本文主要介绍协处理器M7使用方法。M7在运行时可能会涉及到和A53核共用资源,这里列举出会冲突资源如下:ECSPI0/ECSPI2,FLEXCAN,GPIO1/GPIO5,GPT1,I2C3,I2S3,
2022-05-18
基于QT+OpenCV的人脸识别-米尔iMX8M Plus开发板的项目应用
本篇测评由电子工程世界的优秀测评者“流行科技”提供。此次测试的开源项目,是基于QT+OpenCV的人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改,让其运行在米尔iMX8M Plus开发板上。测试项目实际是分了两个工程,一个工程是作为管理员控制功能使用,添加人脸信息。同时也可以查询到打卡记录,对从机进行下发通知等等。人脸识别我们主要需要用到open
2021-10-26
米尔MYS-8MMX开发板试用体验测评——dql2016
米尔MYS-8MMX开发板试用体验测评四日前,米尔科技发布了关于MYS-8MMX开发板的测评公告,公告发布后,吸引了各大媒体平台的测评者争相报名,本期我们分享其中一名优秀测评者的测评报告,供各位参考。想要了解优秀测评者“dql2016”关于MYS-8MMX开发板测评原文的可以复制下方链接查看:https://bbs.elecfans.com/jishu_2159854_1_1.html【米尔MYS
2021-09-29
应用开发笔记 | 米尔MYD-YA15XC-T LoRa无线通讯实例
1.概述本文主要基于LoRa调制功能的无线串口模块的树莓派扩展板,讲述在M4核LoRa的调试过程。2.硬件资源ØTypec Debug线1根ØMicro usb线1根ØMYD-15XC-T开发板Ø树莓派接口SX1262 868M LoRa HAT模块2个3.软件资源ØLinux 5.4.31ØSTM32CubeIDE 1.5.0ØLInux虚拟机Ø米尔提供的SDK4.环境准备预先安装好CubeID