#include "widget.h"
#include "ui_widget.h"
#include <stdio.h>
static CvHaarClassifierCascade* cascade = 0;
static CvMemStorage* storage = 0;
const char* cascade_name ="haarcascade_frontalface_alt.xml"; //人脸检测要用到的分类器
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
imag = new QImage(); // 初始化
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
connect(ui->openBtn, SIGNAL(clicked()), this, SLOT(openCamara()));
connect(ui->takePhotoBtn, SIGNAL(clicked()), this, SLOT(takingPictures()));
connect(ui->closeBtn, SIGNAL(clicked()), this, SLOT(closeCamara()));
}
Widget::~Widget()
{
delete ui;
delete timer;
delete imag;
}
/******************************
********* 打开摄像头 ***********
*******************************/
void Widget::openCamara()
{
cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
timer->start(33); // 开始计时,超时则发出timeout()信号
}
/*********************************
********* 读取摄像头信息 ***********
**********************************/
void Widget::readFarme()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height,
QImage::Format_RGB888).rgbSwapped();
// image.save("01.jpg","JPG");
ui->label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}
/*******************************
***关闭摄像头,释放资源,必须释放***
********************************/
void Widget::closeCamara()
{
timer->stop(); // 停止读取数据。
cvReleaseCapture(&cam);//释放内存;
}
/*************************
********* 拍照 ***********
**************************/
void Widget::takingPictures()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
// QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage qimage = QImage((const uchar*)frame->imageData, frame->width, frame->height,
QImage::Format_RGB888).rgbSwapped();
ui->label_2->setPixmap(QPixmap::fromImage(qimage)); // 将图片显示到label上
bool b = qimage.save("01.jpg","JPG");//保存为图片文件
if(!b)
return;
}
void Widget::detect_and_draw(IplImage *img)
{
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}}
};
double scale = 1.3;
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 );
if( cascade )
{
/*函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供。*/
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 ,
cvSize(30, 30) );
for( int i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, 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 );
}
}
cvShowImage( "result", img );
// cvResizeWindow( "result", 800, 600 );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
void Widget::on_faceDetectBtn_clicked()
{
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); //加载人脸检测所用的分类器
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return ;
}
storage = cvCreateMemStorage(0); //动态存储结构,用来存储人脸在图像中的位置
cvNamedWindow( "result", 1 );
// const char* filename = "lena.jpg"; //待检测图像(包含绝对路径)
const char* filename = "01.jpg";//待检测图像(包含绝对路径)
IplImage* image = cvLoadImage( filename, 1 ); //加载图像
detect_and_draw( image ); //对加载的图像进行检测
cvWaitKey(0);
cvReleaseImage( &image );
cvDestroyWindow("result");
}
没有合适的资源?快使用搜索试试~ 我知道了~
QT使用Opencv库,网络摄像头做的视频监控系统带人脸检测功能
共21个文件
xml:3个
cpp:3个
o:3个
4星 · 超过85%的资源 需积分: 49 44 下载量 75 浏览量
2014-11-07
16:28:01
上传
评论 4
收藏 2.64MB ZIP 举报
温馨提示
QT使用Opencv库,网络摄像头做的视频监控系统带人脸检测功能QT使用Opencv库参考http://blog.sina.com.cn/s/blog_5c70dfc80100qwi3.html QT使用Opencv库打开网络摄像头请参考 http://blog.csdn.net/llh318724/article/details/7007661#
资源推荐
资源详情
资源评论
收起资源包目录
QtOpenCVfaceDetect.zip (21个子文件)
CamaraGet
Makefile.Debug 5KB
haarcascade_frontalface_alt2.xml 818KB
widget.h 983B
haarcascade_frontalface_alt.xml 898KB
CamaraGet.pro 489B
widget.ui 3KB
Makefile.Release 6KB
ui_widget.h 5KB
main.cpp 179B
debug
moc_widget.cpp 3KB
01.jpg 23KB
cv210.dll 1.99MB
CamaraGet.exe 821KB
cxcore210.dll 2.1MB
haarcascade_frontalface_alt.xml 898KB
highgui210.dll 763KB
moc_widget.o 132KB
widget.o 240KB
main.o 119KB
Makefile 6KB
widget.cpp 5KB
release
共 21 条
- 1
资源评论
- NeilH2016-04-25有些简陋,不过确实可以调通
- lqw199407222020-08-06还行,挺好用的
极客雨露
- 粉丝: 799
- 资源: 77
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功