人脸考勤机

本文详细介绍了如何在Ubuntu环境下利用OpenCV进行图像采集和处理,结合百度智能云进行人脸识别,实现人脸考勤机的功能。内容包括问题解决、项目框架、OpenCV的安装与使用、VirtualBox接摄像头的设置,以及人脸识别SDK的环境搭建和代码编译。最后提到了开发板上的移植问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题总结

常用解决问题办法:按照报错信息添加依赖等、仔细查看项目课件、百度报错信息

编译报错:/usr/bin/ld: /tmp/ccOYY87W.o: undefined reference to symbol ‘_ZN2cv6String10deallocateEv’
//usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2: 无法添加符号: DSO missing from command line
collect2: error: ld returned 1 exit status

  • 解决:编译c++文件时缺少必要的依赖,g++编译时需要添加两个库opencv_videoio 和lopencv_core: g++ text.cpp -o text -l opencv_videoio -lopencv_core

多打log(printf函数)便于调试,从log分析

项目主体

环境搭建:VirtualBox虚拟机+Ubuntu18.04

语言:c++

项目框架:opencv

硬件:摄像头、电脑

开发流程:

  • 图像采集(拍照片),需要程序驱动摄像头去采集照片
  • Linux人脸检测,将脸截图出来,使用OpenCV库,opencv只负责人脸检测,照片那块区域是人脸,无法完成人脸识别,人脸识别借助了百度智能云
  • opencv将照片上的人脸截图,然后发送给百度智能云,百度智能云完成人脸对比工作,百度智能云先分析人脸照片的特征,然后和人脸库中的人脸做对比,并找出人脸是哪个人的脸,然后百度智能云通过互联网发送出对比结果

OpenCV

  • OpenCV是一个开源的计算机视觉和机器学习软件库其使用一系列C语言函数和少量C++类实现,内部实现了很多图像处理和计算机视觉的通用算法;OpenCV可以运行在Linux系统上,且其轻量、高效所以在嵌入式领域得到广泛的应用;

  • 在线安装:sudo apt-get install libopencv-dev

    • 注意:执行此命令前先执行apt-get update。apt-get下载某个包中它的所有依赖项都必须存在,这就是为什么我们每次执行apt-get的时候都需要先apt-get update的更新软件包的原因。
  • 查看安装状态:dpkg -s libopencv-dev

  • 安装版本:3.2.0

  • 在线文档:https://opencv.org/

virtualbox接摄像头

  • 乌邦图在能接到摄像头前需要在virtualbox中安装插件,根据virtualbox版本可以在这里找自己需要的驱动插件:https://www.virtualbox.org/wiki/Download_Old_Builds
  • 点击virtualBox中:管理 –> 全局设定 –> 扩展 –> 添加新包
  • 选择刚下载好的驱动安装,安装成功则提示成功安装(如果不成功需要看版本是否匹配)
  • 接下来在 虚拟机设备-摄像头-Integrated Camera勾选即可在虚拟机内使用摄像头了

查询Linux下摄像头编号:

  • 打开Linux终端,使用命令ls /dev/video*即可查询摄像头编号

简单应用opencv实验代码

text.cpp文件:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
   
    VideoCapture cap;	//初始化视频捕获
    cap.open(0);	// 使用编号为0的摄像头
    if (!cap.isOpened()) {
   
        cout << "ERROR! Unable to open camera"<<endl;
        return 0;
    }
    cout << "open camera success!"<<endl;
    return 0;
}

连同opencv库共同编译c++文件命令: g++ text.cpp -o text -l opencv_videoio -lopencv_core

​ 解释:opencv是第三方库,编译器不能从系统中找到该库,代码中使用了VideoCapture,VideoCapture处于opencv_videoio库中,所以编译时需要用-l来指定链接用到的opencv_videoio库

g++是gcc默认语言设为c++的一个特殊版本,连接时自动使用c++标准库而不使用c标准库,如果使用gcc编译c++程序可以使用命令 gcc text.cpp -o text -l opencv_videoio -lopencv_core -lstdc++,选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。

执行编译后的文件:./text

图像采集

一秒切换24帧就可以实现图片转成图像,这里延时40ms

控制台退出正在执行的进程:CTRL+c

实验代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
   
    VideoCapture cap;
    cap.open(0);
    if (!cap.isOpened()) {
   
        cout << "ERROR! Unable to open camera"<<endl;
        return 0;
    }
    cout << "Camera open success!"<<endl;
    Mat frame;	//实例化mat对象,mat是用于存储图像类
    cout << "Start grabbing" << endl;
    for (;;)
    {
   
   	cap.read(frame);	//摄像头照相并且存放到frame中
        if (frame.empty()) {
   
    	 cout << "ERROR! blank frame grabbed"<<endl;
            break;
        }
 	imshow("video", frame);	//打开video名的窗口来显示frame帧
        waitKey(40);
    }
    return 0;
}

连同opencv库共同编译c++文件命令:g++ text.cpp -o text -l opencv_videoio -lopencv_core -lopencv_highgui

图像处理

  • 彩色照片信息量过大,需要转化为黑白照片以提高准确度并降低难度

  • 灰度图人脸轮廓不够清晰

解决方法:直方图均匀化,通过调节照片亮度和对比度来区分脸和背景,使脸更清晰

代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
   
    VideoCapture cap;
    cap.open(0);
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值