ubuntu下用Qt实现人脸识别之检测人脸并绘制人脸框(三)

ubuntu下用Qt实现人脸识别之检测人脸并绘制人脸框(三)

要检测出人脸并且还要识别出这个人是谁,就得用到人脸算法,这个算法如果你足够牛X的话可以自己写出来,当然,如果像我一样是个小菜鸟的话就得领悟----万物为我所用,万物不为我所有----的真谛。那么,怎么做到呢?答案就是借助虹软人脸识别sdk。去虹软官网中将这个SDK下载下来,放到自己的工程目录下。
下载下来的SDK:
下载下来的SDK
将头文件和库文件放到自己的工程目录下
在这里插入图片描述
然后在pro文件中将头文件和库文件包含添加进去即可。

最后在虹软官网中将自己账号中的APP_ID和SDK_KEY记下来,后续可以用来激活SDK

代码实现

基本思路:使用opencv来打开摄像头获取到数据,就这些数据传入到算法的接口中,得到人脸坐标,再使用paintEvent来绘制人脸框。

头文件代码如下(示例):

#include <QWidget>
#include <QImage>
#include <QPainter>
#include <QObject>
#include <QTimer>

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui.hpp"

#include "ASF/inc/merror.h"
#include "ASF/inc/asvloffscreen.h"
#include "ASF/inc/arcsoft_face_sdk.h"
#include "ASF/inc/amcomdef.h"

using namespace cv;

namespace Ui {
class hrQtPro;
}

class hrQtPro : public QWidget
{
    Q_OBJECT

public:
    explicit hrQtPro(QWidget *parent = 0);
    ~hrQtPro();

protected:
    void paintEvent(QPaintEvent* e);

private slots:
    int slotReadFarme();
    
private:
    Ui::hrQtPro *ui;
	VideoCapture capture;
	QTimer  *cvTimer;
	Mat cap;
	QImage qImg;
	ASF_MultiFaceInfo detectedFaces;
	MHandle handle;

    int ASFInit();
    int OpenCamera();
    QImage Mat2QImage(Mat &src);
};

cpp文件代码如下(示例):

#include "hrqtpro.h"
#include "ui_hrqtpro.h"

hrQtPro::hrQtPro(QWidget *parent) :
    QWidget(parent),
    handle(NULL),
    ui(new Ui::hrQtPro)
{
	cvTimer = new QTimer(this);
	connect(cvTimer, SIGNAL(timeout()), this, SLOT(slotReadFarme()));
	ASFInit();
	OpenCamera();
}

hrQtPro::~hrQtPro()
{
	MRESULT res = ASFUninitEngine(handle);
	if (res != MOK)
	    printf("ASFUninitEngine fail: %d\n", res);
	else
	    printf("ASFUninitEngine sucess: %d\n", res);
    if(cvTimer) {
        cvTimer->stop();
        delete cvTimer;
        cvTimer = NULL;
    }
    delete ui;
}

int hrQtPro::ASFInit()
{
    MRESULT res = MOK;
#if 1
	//激活SDK,只需要激活一次即可
	//这里的APP_ID和SDK_KEY是从官网中获取到的
    res = ASFOnlineActivation("APP_ID", "SDK_KEY");
    if (MOK != res && MERR_ASF_ALREADY_ACTIVATED != res)
        qDebug("ASFOnlineActivation fail: %d\n", res);
    else
        qDebug("ASFOnlineActivation sucess: %d\n", res);
#endif
	//只是检测人脸,如果需要人脸识别还需要或上ASF_FACERECOGNITION,例如:ASF_FACE_DETECT | ASF_FACERECOGNITION
    MInt32 mask = ASF_FACE_DETECT;
    res = ASFInitEngine(ASF_DETECT_MODE_VIDEO, ASF_OP_0_ONLY, 16, 5, mask, &handle);
    if (res != MOK)
        qDebug("ASFInitEngine fail: %d\n", res);
    else
        qDebug("ASFInitEngine sucess: %d\n", res);
    return res;
}

int hrQtPro::OpenCamera()
{
	//打开摄像头
    if(capture.open(0)) { 
        qDebug() << "open success";
    } else {
        qDebug() << "open error";
        return -1;
    }
    //设置格式
    capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M','J','P','G'));
    cvTimer->start(20);
    return 0;
}
//图像宽度需要四字节对齐,否则需要裁剪。
void CutIplImage(IplImage* src, IplImage* dst, int x, int y)
{
    CvSize size = cvSize(dst->width, dst->height);//区域大小
    cvSetImageROI(src, cvRect(x, y, size.width, size.height));//设置源图像ROI
    cvCopy(src, dst); //复制图像
    cvResetImageROI(src);//源图像用完后,清空ROI
}
//Mat转换为QImage
QImage hrQtPro::Mat2QImage(Mat &src) {
    if(src.type() == CV_8UC3) {
        const uchar *pSrc = (const uchar*)src.data;
        QImage qImage(pSrc,src.cols,src.rows,src.step,QImage::Format_RGB888);
        return qImage.rgbSwapped();
    }
    return QImage();
}

int hrQtPro::slotReadFarme()
{
	//读取摄像头数据
   capture.read(cap);
   if(!cap.data || cap.empty()) {
       return -1;
   }
   //Mat转换为QImage
   qImg = Mat2QImage(cap);
   if(qImg.isNull())
       return -1;

   IplImage ipi(cap);
   IplImage* img = cvCreateImage(cvSize(ipi.width - ipi.width % 4,
                                        ipi.height), IPL_DEPTH_8U, ipi.nChannels);
   ASVLOFFSCREEN offscreen = { 0 };
   if (img) {
       CutIplImage(&ipi, img, 0, 0);
       offscreen.u32PixelArrayFormat = ASVL_PAF_RGB24_B8G8R8;
       offscreen.i32Width = img->width;
       offscreen.i32Height = img->height;
       offscreen.pi32Pitch[0] = img->widthStep;
       offscreen.ppu8Plane[0] = (MUInt8*)img->imageData;

       MRESULT res = ASFDetectFacesEx(handle, &offscreen, &detectedFaces);
       if (MOK != res) {
           qDebug("ASFDetectFacesEx failed: %d\n", res);
       }
       cvReleaseImage(&img);
   }

}
//绘制人脸框
void hrQtPro::paintEvent(QPaintEvent* e)
{
    if(!qImg.isNull()) {
        QPainter painter(&qImg);
        if(detectedFaces.faceNum > 0) {
        	// 设置人脸框颜色
            painter.setPen(QColor(255, 0, 0));
            //绘制人脸的框
            painter.drawRect(detectedFaces.faceRect[0].left,
                    detectedFaces.faceRect[0].top,
                    detectedFaces.faceRect[0].right - detectedFaces.faceRect[0].left,
                    detectedFaces.faceRect[0].bottom - detectedFaces.faceRect[0].top);
        }
        ui->previewLabel->setPixmap(QPixmap::fromImage(qImg));
    }
}

最后结果

在这里插入图片描述
OK,完成。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Ubuntu系统上,使用QtOpenCV可以实现人脸识别功能。需要先安装QtOpenCV的相关库文件,并在Qt中创建一个新的项目。在项目中导入OpenCV库,并在程序中编写人脸识别算法。可以使用OpenCV提供的CascadeClassifier类对人脸进行识别,并将识别结果显示在Qt界面上。 在识别人脸之前,需要训练一个识别器。可以使用OpenCV提供的train\_cascade工具进行训练,先准备一些包含人脸的正样本图片和一些不包含人脸的负样本图片,在训练过程中,识别器会不断调整参数,直到达到最佳识别效果。 在Qt界面上,可以使用QImage类加载图片,并使用QLabel类显示图片和人脸识别结果,也可以使用QPainter类对图片进行绘制,标出人脸的区域。为了提高识别准确率,可以对人脸图像进行预处理,如灰度化、直方图均衡化等操作。 总的来说,利用Ubuntu系统中的QtOpenCV库,实现人脸识别功能是一件相对容易实现的任务,唯一需要注意的是算法的准确性和效率,需要利用更高级的算法来提高识别的准确率和效率。 ### 回答2: 在Ubuntu操作系统下,结合QTOpenCV可以实现人脸识别功能。首先需要安装OpenCVQT库,可以通过在终端输入命令sudo apt-get install opencv以及sudo apt-get install qt5-default来完成安装。 在QT Creator中新建一个项目,选择QT Widgets Application,然后在主窗口中添加一个按钮和一个标签,作为启动和显示人脸识别结果的界面。然后在该项目文件中添加OpenCV库文件,在项目中添加头文件#include<opencv2/opencv.hpp>。 接下来,需要编写人脸识别程序的代码,使用opencv中的cv::CascadeClassifier类进行人脸检测和识别。首先需要加载训练好的人脸分类器分类器的xml文件,可通过以下代码完成:cv::CascadeClassifier faceCascade;faceCascade.load("haarcascade_frontalface_alt.xml"); 在QT程序中添加启动人脸识别的槽函数,可以使用QT预设的信号和槽机制实现按钮单击后运行人脸识别程序。槽函数中调用OpenCV函数,用分类器进行人脸检测和识别,并把结果输出到QT程序中的标签对象上。 最后编译和运行程序,当单击按钮后,程序即可开始运行人脸识别功能,对抓取的图像进行实时分析和识别。注意,在命令行设置摄像头参数时要注意摄像头分辨率和帧率的设置,以保证识别效果和程序运行流畅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__不高兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值