qml+opencv(二)

实现人脸检测。opencv提供了Haar分类器,其在data文件下还提供了训练的数据,所以实现这个不是很难。
我继承OpenCVaction,实现了人脸检测的算法。

#ifndef OPENCVFACEDETECTACTION_H
#define OPENCVFACEDETECTACTION_H
#include "opencvaction.h"
 class OpenCVfaceDetectAction : public OpenCVaction { Q_OBJECT public: 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了。
运行效果如下:
这里写图片描述

转载于:https://my.oschina.net/u/854744/blog/418190

要在Qt/QML中显示OpenCV获取的摄像头图像,你需要完成以下步骤: 1. 使用OpenCV获取摄像头图像,并将其存储为 `cv::Mat` 对象。 ```cpp cv::VideoCapture cap(0); //打开默认摄像头 cv::Mat frame; cap >> frame; ``` 2. 将 `cv::Mat` 对象转换为 `QImage` 对象。 ```cpp QImage image(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); ``` 3. 将 `QImage` 对象作为属性设置到 QML 中的 `Image` 元素。 ```qml import QtQuick 2.0 Item { Image { id: cameraView width: 640 height: 480 } } ``` ```cpp cameraView.setSource(QUrl::fromLocalFile(QString::fromStdString(imagePath))); ``` 4. 将上述步骤封装到一个 `QObject` 类中,以便从QML中调用。 ```cpp class CameraView : public QObject { Q_OBJECT public: explicit CameraView(QObject *parent = nullptr); Q_INVOKABLE void start(); Q_INVOKABLE void stop(); signals: void imageReady(const QImage &image); private: cv::VideoCapture m_capture; QTimer *m_timer; }; void CameraView::start() { m_capture.open(0); m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, [this]() { cv::Mat frame; m_capture >> frame; QImage image(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); emit imageReady(image); }); m_timer->start(1000 / 30); } void CameraView::stop() { m_timer->stop(); m_capture.release(); } ``` 在上述 `CameraView` 类中,我们使用 `QTimer` 定时器定期获取摄像头图像,并将其转换为 `QImage` 对象。然后,我们通过 `imageReady` 信号将 `QImage` 对象发送到QML中。你可以在QML中连接到 `imageReady` 信号,以更新 `Image` 元素的 `source` 属性。 ```qml import QtQuick 2.0 Item { CameraView { id: camera } Image { id: cameraView width: 640 height: 480 source: "" } Component.onCompleted: { camera.start() camera.imageReady.connect(function(image) { cameraView.source = image }) } Component.onDestruction: { camera.stop() } } ``` 在上述QML代码中,我们创建了一个 `CameraView` 对象,并将其包含在 `Item` 中。我们在 `Component.onCompleted` 信号中连接了 `imageReady` 信号和 `Image` 元素的 `source` 属性,以便在图像就绪时更新它。最后,我们在 `Component.onDestruction` 信号中停止摄像头捕获。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值