ubuntu+opencv+qt小试牛刀2人脸识别

来源:互联网 发布:小约翰 震惊 知乎 编辑:程序博客网 时间:2024/05/22 18:56

1图片展示:


2,代码:

    一、//mainwindow.hpp

(1)包含

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QWidget>
#include <QImage>
#include <QTimer>


#include <QtGui/QMainWindow>
#include <QFileDialog>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/objdetect/objdetect.hpp>
using namespace cv;
using namespace std;

(2)公有成员添加

private:
    QTimer    *timer;    //定时器
    QImage    *imag;   
    CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
  //  IplImage *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
    Mat frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
     String face_cascade_name ;
     String eyes_cascade_name ;
     CascadeClassifier face_cascade;
     CascadeClassifier eyes_cascade;
    void detectAndDisplay( Mat frame )
    {
    std::vector<Rect> faces;
    Mat frame_gray;


    cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
    equalizeHist( frame_gray, frame_gray );
    //-- 人脸检测
    face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );


    for( size_t i = 0; i < faces.size(); i++ )
     {
       Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 );
       ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );
     }
    //-- 显示最终效果图
   // imshow( window_name, frame );
    }

    static QImage ConvertToQImage(cv::Mat &mat)  

 {
        QImage img;
        int nChannel=mat.channels();
        if(nChannel==3)
        {
            cv::cvtColor(mat,mat,CV_BGR2RGB);
            img = QImage((const unsigned char*)mat.data,mat.cols,mat.rows,QImage::Format_RGB888);
        }
        else if(nChannel==4||nChannel==1)
        {
            img = QImage((const unsigned char*)mat.data,mat.cols,mat.rows,QImage::Format_ARGB32);
        }

        return img;
    }   
注:由于没有添加红色的包含,导致:编译始终找不到分类器CascadeClassifier,后来加上即可,
二、//mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    cam     = NULL;
    timer   = new QTimer(this);
    imag    = new QImage();         // 初始化


    face_cascade_name = "haarcascade_frontalface_alt.xml";
    eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";


    connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 时间到,读取当前摄像头信息
    connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));
}


/********* 打开摄像头 ***********/
void MainWindow::openCamara()
{
    cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
    timer->start(33);              // 开始计时,超时则发出timeout()信号
}

/********* 读取摄像头信息 ***********/
void MainWindow::readFarme()
{


        face_cascade.load( face_cascade_name );
        eyes_cascade.load( eyes_cascade_name );
        frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
        detectAndDisplay(  frame );
        QImage image= ConvertToQImage(frame);      //mat  lei zhuanhua wei QImage lei
        ui->label->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上
}


MainWindow::~MainWindow()
注:pc版编译如上图片,ARM版编译报错如下:

由于arm板子不在身边,所以没办法试,自己估计报错原因可能是opencv也是要arm版编译的,而我链接的lib是我 linuxUbuntupc版下编译的。等有板子时在用arm下编译的qt+opencv共同配合。

1 0
原创粉丝点击