limubai的个人空间 https://blog.eetop.cn/1716315 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

基于QT+OpenCV的人脸识别-米尔iMX8M Plus开发板的项目应用

已有 313 次阅读| 2022-5-18 17:26 |系统分类:芯片设计| 人脸识别

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

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

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

OpenCV编译完成后已经提供好了的。
因为这里还需要涉及到训练模型,有了模型后才能更好的识别,所以还是简单介绍下怎么训练的吧。
   
  • CascadeClassifier cascada;

  • cascada.load("F:videoccchaarcascade_frontalface_alt2.xml");

    Mat frame, myFace;

    while (1) {

    cap >> frame;

    Mat frame_gray;

    cascada.detectMultiScale(frame_gray, faces, 1.1, 4, CV_HAAR_DO_ROUGH_SEARCH, Size(70, 70), Size(1000, 1000));

    //识别到的脸用矩形圈出

    {

    }

    if (faces.size() == 1)

    Mat faceROI = frame_gray(faces[0]);//在灰度图中将圈出的脸所在区域裁剪出

    resize(faceROI, myFace, Size(92, 112));//将兴趣域size为92*112

    string filename = format("F:video%d.jpg", pic_num); //图片的存放位置,frmat的用法跟QString差不多

    imshow(filename, myFace);//显示下size后的脸

    destroyWindow(filename);//:销毁指定的窗口

    if (pic_num == 11)

    return 0;//当序号为11时退出循环,一共拍10张照片

    }

    if ((char)c == 27) { break; } //10us内输入esc则退出循环

    waitKey(100);//等待100us

    return 0;



通过上面的代码,完成图像采集。

//读取你的CSV文件路径.

string fn_csv = "F:videocccat.txt";

vector images;

// 读取数据. 如果文件不合法就会出错

try

read_csv(fn_csv, images, labels); //从csv文件中批量读取训练数据

catch (cv::Exception& e)

cerr << "Error opening file "" << fn_csv << "". Reason: " << e.msg << endl;

exit(1);

// 如果没有读取到足够图片,也退出.

string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";

}

{

if (images.size() != Size(92, 112))

cout << i << endl;

}

// 下面的几行代码仅仅是从你的数据集中移除最后一张图片,作为测试图片

Mat testSample = images[images.size() - 1];

images.pop_back();//删除最后一张照片,此照片作为测试图片

// 下面几行创建了一个特征脸模型用于人脸识别,

// T这里是一个完整的PCA变换

// cv::createEigenFaceRecognizer(10);

// 如果你还希望使用置信度阈值来初始化,使用以下语句:

//

// cv::createEigenFaceRecognizer(0, 123.0);

//调用其中的成员函数train()来完成分类器的训练

model->train(images, labels);

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

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

model2->train(images, labels);

// 下面对测试图像进行预测,predictedLabel是预测标签结果

//predict()函数返回一个整形变量作为识别标签

int predictedLabel1 = model1->predict(testSample);

// 还有一种调用方式,可以获取结果同时得到阈值:

// double confidence = 0.0;

string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);

string result_message2 = format("Predicted class = %d / Actual class = %d.", predictedLabel2, testLabel);

cout << result_message1 << endl;

getchar();

return 0;


通过上面的代码进行训练,训练使用了python。所以系统环境需要配置好。


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

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

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

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

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


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



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


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


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


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

图片


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


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


要了解优秀测评者“流行科技”关于MYD-J8MPQC开发板测评原文的可以复制下方链接查看:

http://bbs.eeworld.com.cn/thread-1199387-1-1.html

iMX8M Plus开发板可以在米尔官网查看具体的产品介绍:

http://www.myir-tech.com/product/myd-jx8mpq.htm

需要购买米尔MYD-JX8MPQ开发板的可以复制下方链接购买:

https://detail.tmall.com/item.htm?id=662541228115



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 1

    获赞
  • 1

    评论
  • 241

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-9 18:57 , Processed in 0.018060 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部