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共同配合。