qml+opencv(二)
来源:互联网 发布:淘宝刷流量多少钱一单 编辑:程序博客网 时间:2024/06/11 17:58
实现人脸检测。opencv提供了Haar分类器,其在data文件下还提供了训练的数据,所以实现这个不是很难。
我继承OpenCVaction,实现了人脸检测的算法。
#ifndef OPENCVFACEDETECTACTION_H#define OPENCVFACEDETECTACTION_H#include "opencvaction.h"class OpenCVfaceDetectAction : public OpenCVaction{ Q_OBJECTpublic: OpenCVfaceDetectAction(QObject *parent = 0); ~OpenCVfaceDetectAction(); void action(IplImage *imgin, IplImage *&imgout);signals: void a();private: CvHaarClassifierCascade* m_cascade; CvMemStorage* m_storage; double m_scale;};#endif // OPENCVFACEDETECTACTION_H#include "opencvfacedetectaction.h"#include <QDebug>const char* cascade_name = "data/haarcascade_frontalface_alt.xml";OpenCVfaceDetectAction::OpenCVfaceDetectAction(QObject *parent): OpenCVaction(parent), m_cascade(NULL), m_storage(NULL), m_scale(1.3){ m_cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0); if (!m_cascade) { qDebug() << "load Cascade fail!"; } m_storage = cvCreateMemStorage(0);}OpenCVfaceDetectAction::~OpenCVfaceDetectAction(){ if (m_cascade) { cvReleaseHaarClassifierCascade(&m_cascade); } cvReleaseMemStorage(&m_storage);}void OpenCVfaceDetectAction::action(IplImage *imgin, IplImage *&imgout){ imgout = cvCloneImage(imgin); if (!m_cascade) { qDebug() << "Cascade is invaild!"; return; } static CvScalar color = CV_RGB(255, 255, 255); //Image Preparation // IplImage* gray = cvCreateImage(cvGetSize(imgin), 8, 1); IplImage* small_img = cvCreateImage(cvSize(cvRound(imgin->width / m_scale), cvRound(imgin->height / m_scale)), 8, 1); cvCvtColor(imgin, gray, CV_BGR2GRAY); cvResize(gray, small_img, CV_INTER_LINEAR); cvEqualizeHist(small_img, small_img); //直方图均衡 //Detect objects if any // cvClearMemStorage(m_storage); double t = (double)cvGetTickCount(); CvSeq *objects = cvHaarDetectObjects(small_img, m_cascade, m_storage, 1.1, 2, 0, cvSize(50,50)); t = (double)cvGetTickCount() - t; qDebug() << "detection time =" << t / ((double)cvGetTickFrequency()*1000.) << "ms"; //Loop through found objects and draw boxes around them for(int i=0; i < (objects ? objects->total : 0); ++i) { CvRect* r = (CvRect*)cvGetSeqElem(objects, i); cvRectangle(imgout, cvPoint(r->x * m_scale, r->y * m_scale), cvPoint((r->x + r->width) * m_scale, (r->y + r->height) * m_scale), color, 2, CV_AA); } cvReleaseImage(&gray); cvReleaseImage(&small_img); emit a();}
在OpenCVshowFrame中,添加下面
OpenCVfaceDetectAction *f = new OpenCVfaceDetectAction(); m_actions.push_back(f);
就ok了。
运行效果如下:
0 0
- qml+opencv(二)
- qml+opencv(一)
- Qml 笔记二
- 解读QML之二
- 解读QML之二
- qml截图方法二
- opencv视频采集封装qml
- Qt5与QML(二)
- QML所有的元素二
- Qt、Opencv、QML实现摄像头简单对比
- opencv( 二)
- QML之QML之使用C++自定义QML类型(二)
- qml
- QML
- QML
- qml
- QML
- QML
- 第六周【项目3-人数不定的工资类】
- 算法导论思考题9-3小顺序统计量问题
- AFNetworking 小贴士~~
- 重建控制文件
- The features of the film faced plywood
- qml+opencv(二)
- java CopyOnWriteArrayList的使用
- 西风的数据结构教程(1)——链表
- jQuery针对各类元素操作基础教程
- OneDayOneClass----UISwitch
- Volley 我的见解
- 2015年4月编程语言排行榜
- 存储过程 函数
- 慕课总结分享 - 栈和队列的总结