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

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

3天内不再提示

Linux下QT配合OpenCV完成图像处理(实现人脸检测)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 09:28 次阅读

一、环境介绍

ubuntu版本: VM虚拟机运行ubuntu18.04 64位

OpenCV版本: 3.4.9

QT版本: 5.12

OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉机器学习软件库,可以运行在 Linux、Windows、Android 和 Mac OS 操作系统上。

OpenCV 的全称是 Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV 是由英特尔公司发起并参与开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用。OpenCV 可用于开发实时的图像处理、计算机视觉以及模式识别程序。

OpenCV 用 C++语言编写,它具有 C ++,PythonJavaMATLAB 接口,并支持 Windows,Linux,Android 和 Mac OS,OpenCV 主要倾向于实时视觉应用,并在可用时利用 MMX 和 SSE 指令, 如今也提供对于 C#、Ch、Ruby,GO 的支持。

二、建立QT工程加入OpenCV依赖库

下面编写例子很简单,使用OpenCV自带的分类器,检测一张图中的人脸,并圈出来。

opencv源码自带的人脸检测分类器目录:opencv-3.4.9/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml

xxx.pro工程文件代码:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

#linu平台的路径设置
linux {
#添加opencv头文件的路径,需要根据自己的头文件路径进行修改
INCLUDEPATH+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/include\
             /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv\
             /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv2

LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_calib3d.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_core.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_dnn.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_features2d.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_flann.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_highgui.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgcodecs.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_imgproc.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_ml.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_objdetect.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_photo.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_shape.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_stitching.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_superres.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_videoio.so
LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_video.so
}

widget.cpp文件代码:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    opencv_face();
}

Widget::~Widget()
{
    delete ui;
}

//分类器的路径
#define source_xml_addr "/home/wbyq/work_pc/opencv-3.4.9/data/haarcascades_cuda/haarcascade_frontalface_alt2.xml"

//将要检测的图片路径
#define source_pix_addr "/mnt/hgfs/linux-share-dir/1.jpg"

//人脸检测代码
void Widget::opencv_face()
{
    static CvMemStorage* storage = 0;
    static CvHaarClassifierCascade* cascade = 0;

    fprintf( stderr, "start------------------------------>1 \n" );

    const char*cascade_name =source_xml_addr;

    //加载分类器
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
    if( !cascade )
    {
        fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
        return ;
    }

    //创建内存空间
    storage = cvCreateMemStorage(0);

    //加载需要检测的图片
    const char* filename =source_pix_addr;
    IplImage* img = cvLoadImage( filename, 1 );

    if(img ==nullptr )
    {
        fprintf( stderr, "jpg load error! \n" );
        return;
    }

     fprintf( stderr, "start------------------------------>2 \n" );

    double scale=1.2;
    static CvScalar colors[] = {
        {{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},
        {{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}
    };//Just some pretty colors to draw with
    IplImage* gray = cvCreateImage(cvSize(img->width,img->height),8,1);
    IplImage* small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),8,1);
    cvCvtColor(img,gray, CV_BGR2GRAY);
    cvResize(gray, small_img, CV_INTER_LINEAR);

    cvEqualizeHist(small_img,small_img); //直方图均衡

    cvClearMemStorage(storage);

    double t = (double)cvGetTickCount();
    CvSeq* objects = cvHaarDetectObjects(small_img,
                                           cascade,
                                           storage,
                                           1.1,
                                           2,
                                           0/*CV_HAAR_DO_CANNY_PRUNING*/,
                                           cvSize(30,30));

       t = (double)cvGetTickCount() - t;

     fprintf( stderr, "start------------------------------>3 \n" );

    //遍历找到对象和周围画盒
    for(int i=0;i<(objects->total);++i)
    {
        CvRect* r=(CvRect*)cvGetSeqElem(objects,i);
        cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]);
    }

     fprintf( stderr, "start------------------------------>4 \n" );

    for( int i = 0; i < (objects? objects->total : 0); i++ )
    {
        CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
        CvPoint center;
        int radius;
        center.x = cvRound((r->x + r->width*0.5)*scale);
        center.y = cvRound((r->y + r->height*0.5)*scale);
        radius = cvRound((r->width + r->height)*0.25*scale);
        cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
    }

    show_face(img);  //显示检测的结果

    cvReleaseImage(&gray);
    cvReleaseImage(&small_img);

    //释放图片
    cvReleaseImage( &img );
}
//显示检测的结果
void Widget::show_face(IplImage* img)
{
    /*将opecv的图片转为qimage格式*/
    uchar *imgData=(uchar *)img->imageData;

    QImage  my_image(imgData,img->width,img->height,QImage::Format_RGB888);
    my_image =my_image.rgbSwapped(); //BGR格式转RGB
    QPixmap my_pix; //创建画图类

    my_pix.convertFromImage(my_image);

    /*在控件上显示*/
    ui->label_display_face->setPixmap(my_pix);
}

widget.h文件代码:

#ifndef WIDGET_H
#define WIDGET_H

#include 
//opencv include
#include 
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    void opencv_face();
    ~Widget();
    void show_face(IplImage* img);
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

运行代码检测结果如下:

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

    关注

    26

    文章

    1224

    浏览量

    55806
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206720
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40764
收藏 人收藏

    评论

    相关推荐

    基于openCV人脸检测系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,
    发表于 12-23 14:19

    【TL6748 DSP申请】基于TMS320C6748 DSP人脸检测及跟踪

    申请理由:我们是公司的研发团队,正在研发人脸检测及跟踪。之前使用的是TI达芬奇系列DM6446芯片,将OpenCV移植到DM6446的DSP上发现处理效率太低。分析主要原因是dm644
    发表于 09-10 11:09

    Qt使用openCV

    使用QtOpenCV进行数字图像处理了还是很不错的,参考网上一个帖子分享一经验:环境:Windows
    发表于 11-22 16:12

    【NanoPi2申请】基于opencv人脸识别门禁系统

    防与监控的系统,望批准!谢谢!项目描述:项目简述:本项目旨在一个较高性能的嵌入式平台上搭建一个linux系统,利用opencv编程实现人脸识别。为了
    发表于 12-18 14:34

    【Raspberry Pi 3试用体验】+编译opencv

    实现图像处理和计算机视觉方面的很多通用算法。需要完成此次的项目,离不开opencv的支持,接下来我们就在树莓派上安装
    发表于 05-05 18:13

    基于QT+OpenCv的目标跟踪算法实现

    目标跟踪算法作为一种有着非常广泛的应用的算法,在航空航天、智能交通、智能设备等领域有着非常广泛的应用。本系列博客将教大家在410c开发板上基于linux操作系统环境,采用QT+Opencv实现
    发表于 09-21 10:42

    Vivado HLS实现OpenCV图像处理的设计流程与分析

    本文通过对OpenCV图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS中调用OpenCV库函数实现
    发表于 07-08 08:30

    ARM LinuxOpenCV的移植和使用方法

    的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。本篇介绍ARM Linux
    发表于 11-03 07:01

    基于linux操作系统实现一个人脸识别门禁系统

    形成组网,实现一个人脸识别门禁系统。客户端为嵌入式Linux设备,采用QT库显示界面,通过摄像头采集图像。服务器为PC上 Ubuntu系统,
    发表于 12-14 06:24

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

    opencv人脸检测分类器。OpenCV编译完成后已经提供好了的。因为这里还需要涉及到训练模型,有了模型后才能更好地识别,所以还是简单介
    发表于 05-17 17:43

    【飞凌RK3588开发板试用】实现人脸检测

    ))[2:-1] return img_date_url添加代码后,重新启动服务,打开网页,当图像中出现人脸时就可以检测出来了:CPU占用情况如下图,占用率非常小。【小结】tornado的服务+
    发表于 03-09 14:10

    基于openCV人脸检测识别系统的设计

    通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,
    发表于 06-15 10:53 477次下载
    基于<b class='flag-5'>openCV</b>的<b class='flag-5'>人脸</b><b class='flag-5'>检测</b>识别系统的设计

    openCV人脸检测系统的设计方案探究

    摘要: 通过对基于 Adaboost 人脸检测算法的研究,利用该算法与计算机视觉类库 openCV 进行人脸检测系统的设计,
    发表于 10-20 16:39 3次下载

    关于人脸识别技术原理分析和应用

    脸识别系统可以在Linux 操作系统下利用QT库来开发图形界面,以OpenCV 图像处理库为基础,利用库中提供的相关功能函数进行各种
    的头像 发表于 08-26 11:42 4282次阅读

    LinuxQT+OpenCV实现人脸实时检测(摄像头)

    标签上。人脸检测分类器采用OpenCV自带的分类器,程序主要目的是介绍OpenCV配合QT如何进
    的头像 发表于 08-14 09:29 1454次阅读
    <b class='flag-5'>Linux</b>下<b class='flag-5'>QT+OpenCV</b><b class='flag-5'>实现</b><b class='flag-5'>人脸</b>实时<b class='flag-5'>检测</b>(摄像头)