0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

QT+OpenCV人脸识别—米尔iMX8MPlus开发板项目

米尔MYIR 来源:米尔MYIR 作者:米尔MYIR 2022-05-18 18:00 次阅读

本篇测评由电子工程世界的优秀测评者“流行科技”提供。

此次测试的开源项目,是基于QT+OpenCV的人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改,让其运行在米尔iMX8M Plus开发板上。

poYBAGKEwi6AY9jwAABTf11XXg4829.png

测试项目实际是分了两个工程,一个工程是作为管理员控制功能使用,添加人脸信息。同时也可以查询到打卡记录,对从机进行下发通知等等。

人脸识别我们主要需要用到opencv的人脸检测分类器。

pYYBAGKEwkeAMzq1AACDsGszgqw686.png

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 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 images;

vector 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<();<>

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 model = face::EigenFaceRecognizer::create();

model->train(images, labels);

model->save("MyFacePCAModel.xml");//保存路径可自己设置,但注意用“”

Ptr model1 = face::FisherFaceRecognizer::create();

model1->train(images, labels);

model1->save("MyFaceFisherModel.xml");

Ptr 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。所以系统环境需要配置好。

poYBAGKEwl6AQKHtAAAm8l7Gwow014.png

在此文件中,把我们采集到的图像,放进去,新建一个文件夹。

poYBAGKEwmyATvSEAABt9rLqLms536.png

之后就是把我们的at.txt也加入我们的文件。

pYYBAGKEwnmAX7M1AAB6AnakQhQ378.png

训练好后,我们就得到了我们所需要的训练文件。

poYBAGKEwoSAEKhsAABN9e09ki0029.png

在我们打卡界面,点击打卡时就是这样的。加载训练好的东西。然后启动定时器,去获取摄像头信号,然后对比,最终和数据库一致就认为打卡成功。

上面训练部分,其实提供的另一个工程就全部完成了。

poYBAGKEwpGASG9iAABFuJ2enWs396.png

这是我们win端界面,圆框就是我们摄像头采集图像显示的位置。

pYYBAGKEwpyAFIqiAABEtCveTHg066.png

我们需要在Ubuntu下把库全部替换,这样就能编译过了,然后拷贝到开发板上运行。如下:

pYYBAGKEwqaAKh6yAAAsOzMnM4Y825.png

进来就提示数据库打开失败了,我们这个都是基于数据库,所以还是比较尴尬的,后期的话可以尝试自己全部编译下,然后更新吧。目前就测试,看下效果吧。

pYYBAGKEwriAHmWPAADzCEbAve8180.png

使用的硬件增加了一个摄像头。

pYYBAGKEwsOAACWNAADJEkIMIyA546.png

这是打开摄像头采集的样子。

pYYBAGKDbRWADoP6ABz9qHtm7fY289.gif

这个GIF展示了我们的人脸检测情况。

poYBAGKEwtaAEPbSAABSE9pWx4Y131.png

由于没有数据库,只能打印一些信息。当两个数据相等时就进入下一步,判断打卡了。由于没有数据库,就展示下电脑端的效果吧。

pYYBAGKEwuOAdM_0AABKUBgTxkQ268.pngpoYBAGKEwumAIlXbAABbm5btOrU794.png

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    25

    文章

    4881

    浏览量

    97002
  • 人脸识别
    +关注

    关注

    76

    文章

    4002

    浏览量

    81639
收藏 人收藏

    评论

    相关推荐

    198元,米尔NXP i.MX 93开发板,限购300套

    米尔NXPi.MX93开发板凭借其卓越的性能、强劲的推理能力以及丰富的接口资源,在众多行业应用中都得到了广泛认可,为回馈广大行业客户的支持与厚爱,进一步激发开发者的创新潜能,共同推动技术的发展与进步
    的头像 发表于 09-27 08:00 258次阅读
    198元,<b class='flag-5'>米尔</b>NXP i.MX 93<b class='flag-5'>开发板</b>,限购300套

    QT5+OpenCV4搭建应用开发环境

    作为深度学习算法工程师,必须要掌握应用开发技能吗?搞工程肯定是必须要会界面开发QT就是一个很不错的选择。本文以QT5.15 + OpenCV
    的头像 发表于 07-23 11:23 841次阅读
    <b class='flag-5'>QT5+OpenCV</b>4搭建应用<b class='flag-5'>开发</b>环境

    基于OpenCV人脸识别系统设计

    基于OpenCV人脸识别系统是一个复杂但功能强大的系统,广泛应用于安全监控、人机交互、智能家居等多个领域。下面将详细介绍基于OpenCV人脸
    的头像 发表于 07-11 15:37 1.1w次阅读

    米尔基于NXP iMX.93开发板的M33处理器应用开发笔记

    资源MYD-LMX9X开发板米尔基于NXPiMX.93开发板)3.软件资源Windows7及以上版本软件:IAREmbeddedWorkbench4.板载固件调试
    的头像 发表于 06-29 08:01 1189次阅读
    <b class='flag-5'>米尔</b>基于NXP <b class='flag-5'>iMX</b>.93<b class='flag-5'>开发板</b>的M33处理器应用<b class='flag-5'>开发</b>笔记

    点击参与米尔NXP i.MX 93开发板有奖试用

    米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了3块价值678元的MYD-LMX9X开发板发起试用活动您不仅可以免费体
    的头像 发表于 06-13 08:02 424次阅读
    点击参与<b class='flag-5'>米尔</b>NXP i.MX 93<b class='flag-5'>开发板</b>有奖试用

    米尔NXP i.MX 93开发板Qt开发指南

    1. 概述Qt 是一个跨平台的图形应用开发框架,被应用在不同尺寸设备和平台上,同时提供不同版权版本供用户选择。米尔 NXP i.MX 93 开发板(MYD-LMX9X
    发表于 06-07 20:45

    米尔NXP i.MX 93开发板Qt开发指南

    1.概述Qt是一个跨平台的图形应用开发框架,被应用在不同尺寸设备和平台上,同时提供不同版权版本供用户选择。米尔NXPi.MX93开发板(MYD-LMX9X
    的头像 发表于 06-07 08:01 1605次阅读
    <b class='flag-5'>米尔</b>NXP i.MX 93<b class='flag-5'>开发板</b>的<b class='flag-5'>Qt</b><b class='flag-5'>开发</b>指南

    【OpenHarmony鸿蒙实战】在RK3399开发板实现智能门禁人脸识别

    基于RK3399开发板,使用OpenHarmony3.0-LTS开发的应用。通过定时获取摄像头数据,实现人脸识别比对等功能。
    的头像 发表于 03-20 17:38 1118次阅读
    【OpenHarmony鸿蒙实战】在RK3399<b class='flag-5'>开发板</b>实现智能门禁<b class='flag-5'>人脸</b><b class='flag-5'>识别</b>

    项目分享|基于ELF 1开发板的远程监测及人脸识别项目

    今天非常荣幸地向各位小伙伴分享一个由共创社成员完成的远程监测及人脸识别项目,该项目依托ELF1开发板为核心硬件平台,构建了一套完整的视频监控系统,并在此基础上集成了
    的头像 发表于 03-13 16:41 477次阅读
    <b class='flag-5'>项目</b>分享|基于ELF 1<b class='flag-5'>开发板</b>的远程监测及<b class='flag-5'>人脸</b><b class='flag-5'>识别项目</b>

    项目分享|基于ELF 1开发板的车牌识别系统

    项目选用ElfBoardELF1开发板作为核心硬件平台,利用USB接口连接的摄像头捕捉并识别车牌信息。一旦车牌成功识别,系统会触发绿灯指示,并将
    的头像 发表于 03-12 09:22 413次阅读
    <b class='flag-5'>项目</b>分享|基于ELF 1<b class='flag-5'>开发板</b>的车牌<b class='flag-5'>识别</b>系统

    米尔-全志T113-i开发板试用】发布opencv-mobile米尔t113i专享预编译包

    MYC-YT113i核心开发板 真正的国产核心,100%国产物料认证 国产T113-i处理器配备2*Cortex-A7@1.2GHz ,RISC-V 外置DDR3接口、支持视频编解码器
    发表于 02-25 20:23

    米尔电子和瑞萨电子推出首款MPU生态开发板瑞米派

    近日,米尔电子和瑞萨电子共同定义和开发了瑞萨第一款MPU生态开发板——瑞米派(Remi Pi)正式上市了!在各种Pi板卡琳琅满目的当下,Remi Pi是一款与众不同的开发板,它兼顾了严
    的头像 发表于 01-25 09:21 993次阅读

    米尔-全志T113-i开发板试用】基础开发环境配置和opencv-mobile移植测试

    米尔-全志T113-i开发板试用】基础开发环境配置和opencv-mobile移植测试 MYC-YT113i核心
    发表于 01-23 15:13

    米尔-TIAM62开发板-接替335x-试用评测】5、QT应用开发体验

    ../ && make -j8 运行 编译完成后,我们把程序复制到开发板上运行,就可以看到qt的计算器demo运行起来了。
    发表于 01-05 20:32

    米尔-全志T113-i开发板试用】基础开发环境配置和opencv-mobile移植测试

    米尔-全志T113-i开发板试用】基础开发环境配置和opencv-mobile移植测试 MYC-YT113i核心
    发表于 12-27 20:04