#include "cameramanage.h"
#include "ui_cameramanage.h"
#include <QPixmap>
#include <QFileDialog>
#include <QPicture>
#include <opencv2/objdetect.hpp>
#include <iostream>
//static CvHaarClassifierCascade* cascade = 0;
//static CvMemStorage* storage = 0;
const char* cascade_name ="haarcascade_frontalface_alt.xml"; //人脸检测要用到的分类器
const char* cascade_name_class ="haarcascade_eye_tree_eyeglasses.xml";
CameraManage::CameraManage(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CameraManage)
{
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
timer_1 = new QTimer(this);
// image = new QImage(); // 初始化
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
// connect(timer_1, SIGNAL(timeout()), this, SLOT(on_videoDete_clicked()));
connect(ui->open, SIGNAL(clicked()), this, SLOT(on_open_clicked()));
connect(ui->close, SIGNAL(clicked()), this, SLOT(on_close_clicked()));
connect(ui->takePhono, SIGNAL(clicked()), this, SLOT(on_takePhono_clicked()));
connect(ui->videoDete, SIGNAL(clicked()), this, SLOT(on_videoDete_clicked()));
}
CameraManage::~CameraManage()
{
delete ui;
delete timer;
// delete image;
}
QImage CameraManage::Mat2QImage(Mat& cvImg)
{
QImage qImg;
if(cvImg.channels()==3) //3 channels color image
{
cv::cvtColor(cvImg,cvImg,CV_BGR2RGB);
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if(cvImg.channels()==1) //grayscale image
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
return qImg;
}
QImage CameraManage::ScaleImage2Label(QImage qImage, QLabel* qLabel)
{
QImage qScaledImage;
QSize qImageSize = qImage.size();
QSize qLabelSize = qLabel->size();
double dWidthRatio = 1.0*qImageSize.width() / qLabelSize.width();
double dHeightRatio = 1.0*qImageSize.height() / qLabelSize.height();
if (dWidthRatio>dHeightRatio)
{
qScaledImage = qImage.scaledToWidth(qLabelSize.width());
}
else
{
qScaledImage = qImage.scaledToHeight(qLabelSize.height());
}
return qScaledImage;
}
void CameraManage::on_open_clicked()
{
cap.open(0);
timer->start(33); // 开始计时,超时则发出timeout()信号
}
void CameraManage::readFarme()
{
cap >> frame;
// imshow("nihao",frame);
image = Mat2QImage(frame);
// image = QImage(image.scaled(240, 120)); // change for the usb camera
QImage scaleImage = ScaleImage2Label( image, ui->lable ); // 显示到label上
ui->lable->setPixmap(QPixmap::fromImage(scaleImage));
ui->lable->setAlignment(Qt::AlignCenter);
ui->lable->show();
}
void CameraManage::on_close_clicked()
{
timer->stop(); // 停止读取数据。
cap.release(); //释放内存
frame.release();
ui->lable->setText("video closed");
}
void CameraManage::on_takePhono_clicked()
{
bool b = image.save("01.jpg","JPG");//保存为图片文件
if(!b)
return;
}
void CameraManage::on_faceDete_clicked()
{
Mat image_dete;
const char* filename = "01.jpg";//待检测图像(包含绝对路径)
image_dete = imread(filename, CV_LOAD_IMAGE_COLOR); //加载图像
// detectAndDraw( image_dete);
}
/*************************
********* method two ***********
**************************/
void CameraManage::detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip )
{
double t = 0;
vector<Rect> faces, faces2;
const static Scalar colors[] =
{
Scalar(255,0,0),
Scalar(255,128,0),
Scalar(255,255,0),
Scalar(0,255,0),
Scalar(0,128,255),
Scalar(0,255,255),
Scalar(0,0,255),
Scalar(255,0,255)
};
Mat gray, smallImg;
cvtColor( img, gray, COLOR_BGR2GRAY );
double fx = 1 / scale;
cv::resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR );
equalizeHist( smallImg, smallImg );
t = (double)getTickCount();
cascade.detectMultiScale( smallImg, faces,
1.1, 2, 0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|CASCADE_SCALE_IMAGE,
Size(30, 30) );
if( tryflip )
{
flip(smallImg, smallImg, 1);
cascade.detectMultiScale( smallImg, faces2,
1.1, 2, 0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
|CASCADE_SCALE_IMAGE,
Size(30, 30) );
for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r )
{
faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
}
}
t = (double)getTickCount() - t;
printf( "detection time = %g ms\n", t*1000/getTickFrequency());
for ( size_t i = 0; i < faces.size(); i++ )
{
Rect r = faces[i];
Mat smallImgROI;
vector<Rect> nestedObjects;
Point center;
Scalar color = colors[i%8];
int radius;
double aspect_ratio = (double)r.width/r.height;
if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
{
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);
circle( img, center, radius, color, 3, 8, 0 );
}
else
rectangle( img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
cvPoint(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)),
color, 3, 8, 0);
if( nestedCascade.empty() )
continue;
smallImgROI = smallImg( r );
nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
1.1, 2, 0
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
//|CASCADE_DO_CANNY_PRUNING
|CASCADE_SCALE_IMAGE,
Size(30, 30) );
for ( size_t j = 0; j < nestedObjects.size(); j++ )
{
Rect nr = nestedObjects[j];
center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
radius = cvRound((nr.width + nr.height)*0.25*scale);
circle( img, center, radius, color, 3, 8, 0 );
}
}
// imshow( "result", img );
QImage image_de = Mat2QImage( img );
QImage scaleImage = ScaleImage2Label( image_de, ui->lable );
ui->lable->setPixmap(QPixmap::fromImage(scaleImage));
ui->lable->setAlignment(Qt::AlignCenter);
ui->lable->show();
}
void CameraManage::on_videoDete_clicked()
{
// timer_1->start(33);
CascadeClassifier cascade, nestedCascade;
if( !cascade.load(cascade_name) || !nestedCascade.load(cascade_name_class) )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return ;
}
capDete.open(0);
bool tryflip = 1;
double scale = 1;
if( capDete.isOpened() )
{
for(;;)
{
capDete >> fram_dete;
没有合适的资源?快使用搜索试试~ 我知道了~
Qt+opencv+摄像头+人脸检测
共71个文件
o:12个
sample:9个
xml:7个
3星 · 超过75%的资源 需积分: 50 203 下载量 91 浏览量
2017-09-18
11:20:19
上传
评论 22
收藏 7.18MB ZIP 举报
温馨提示
Qt和opencv配置好后,打开该工程,将pro中opencv路径改成自己的就直接能用,代码有注释,用的是分类器,具体自己看代码
资源详情
资源评论
资源推荐
收起资源包目录
CameraManage.zip (71个子文件)
cameramanage.h 2KB
CameraManage.pro.user 23KB
output
haarcascade_eye_tree_eyeglasses.xml 588KB
main.o 1.11MB
highgui210.dll 763KB
2.jpg 20KB
moc_cameramanage.o 893KB
cameramanage.o 1.3MB
haarcascade_frontalface_alt.xml 661KB
cxcore210.dll 2.1MB
CameraManage 1.3MB
moc_cameramanage.cpp 4KB
cv210.dll 1.99MB
release
lena.jpg 90KB
debug
main.o 1017KB
moc_cameramanage.o 946KB
cameramanage.o 1.29MB
moc_cameramanage.cpp 4KB
moc_predefs.h 10KB
CameraManage.exe 2.78MB
ui_cameramanage.h 6KB
.qmake.stash 676B
Makefile 24KB
Makefile.Debug 65KB
Makefile.Release 65KB
01.jpg 245KB
haarcascade_frontalface_alt.xml 898KB
CameraManage.pro 923B
release
haarcascade_eye_tree_eyeglasses.xml 588KB
main.o 87KB
moc_cameramanage.o 95KB
cameramanage.o 126KB
haarcascade_frontalface_alt.xml 661KB
CameraManage 99KB
moc_cameramanage.cpp 4KB
ui_cameramanage.h 6KB
Makefile 18KB
01.jpg 111KB
CameraManage.pro.user.250954a 18KB
debug
haarcascade_eye_tree_eyeglasses.xml 588KB
main.o 771KB
moc_cameramanage.o 670KB
cameramanage.o 1.15MB
haarcascade_frontalface_alt.xml 661KB
CameraManage 1.11MB
moc_cameramanage.cpp 4KB
ui_cameramanage.h 6KB
Makefile 50KB
main.cpp 176B
.git
info
exclude 240B
index 424B
objects
50
5dbc89b202affcf9915f604158c646e8a025ef 309B
32
59046f1e1aa8bce78cc5a2e749a9f9a7472679 145B
44
8e8b92d27a5c59ba3dc61c1491f9094b2f5881 203B
24
24653c8bde87f030f48fdc7a133f27ca5a9b6b 153B
d9
d84b4929df60b5bbecf1b5e9da8763c45964a2 224B
HEAD 23B
config 92B
hooks
pre-applypatch.sample 424B
pre-push.sample 1KB
commit-msg.sample 896B
pre-commit.sample 2KB
applypatch-msg.sample 478B
prepare-commit-msg.sample 1KB
update.sample 4KB
post-update.sample 189B
pre-rebase.sample 5KB
description 73B
cameramanage.ui 4KB
CameraManage.pro.user.ac1cfe2 23KB
cameramanage.cpp 8KB
共 71 条
- 1
worthsen
- 粉丝: 5377
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1