图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹(1)

来源:互联网 发布:555是什么意思网络用语 编辑:程序博客网 时间:2024/04/28 13:51

博主QQ:1356438802

QQ群:473383394——UVC&OpenCV473383394


平台:Win7 64bits + Qt 5.3.0 MinGW 32bit + OpenCV 2.4.10



在前面的文章中,我已经实现了捕获红外LED灯的光点,并且借助OpenCV的imshow()函数,可以直接将光点轨迹图像显示在窗体界面上。

另外由于OpenCV是纯C/C++的开源库,可以在VisualStudio和QT开发平台中,无缝切换编译运行(当然前提是你已经准备好了两个平台的OpenCV库),在上一篇文章的末尾,我已经分别给出了VisualStudio和QT两个平台的源码。


于是我现在要在上述QT的源码《LED_detect.rar》的基础上,再改进。我在多个场合说过,MFC平台不适合做UI,没有布局工具,非常麻烦,这就是为什么我现在要迁移到QT开发平台。而且OpenCV自带的窗体不美观,交互性也很弱,不适合直接拿来做产品,那么我现在要结合OpenCV的算法优势和QT的桌面软件编程优势,继续深入手写笔应用的开发!


核心思想:单独开一个线程,专门负责摄像头的图像识别工作,即捕获LED灯光点,计算光点坐标,再反馈给QT的UI界面,绘图。


涉及的QT知识点:

1. paintEvent绘图事件

2. 信号与槽

3. QT线程的一种新用法


mainwindow.cpp文件如下

#include <QMessageBox>#include <QThread>#include <QDebug>#include "cfg.h"#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    mIsFirstPoint = true;    mCenterPoint = mPrevCenterPoint = QPointF(0.0, 0.0);    //把LED灯追踪放入一个子线程里面运行    mTracker = new Track();    mTrackThread = new QThread(this);    mTracker->moveToThread(mTrackThread);    connect(this, SIGNAL(startTrack()), mTracker, SLOT(startTrack()));    connect(mTracker, SIGNAL(TrackPoint(QPointF)), this, SLOT(setPoints(QPointF)));    connect(mTracker, SIGNAL(errnum(int)), this, SLOT(errProc(int)));    mTrackThread->start();}MainWindow::~MainWindow(){    //停止图像识别    mTracker->StopTrack();    //结束线程    mTrackThread->quit();    mTrackThread->wait();    delete mTrackThread;    delete mTracker;    delete ui;}void MainWindow::paintEvent(QPaintEvent *event){    Q_UNUSED(event);    QPainter painter(this);    // 反走样 反锯齿    painter.setRenderHint(QPainter::Antialiasing, true);    // 设置画笔颜色    painter.setPen(QColor(0, 160, 230));    // 绘制直线    painter.drawLine(mPrevCenterPoint, mCenterPoint);    // 保存当前光点坐标, 下次绘制时使用    mPrevCenterPoint = mCenterPoint;}void MainWindow::setPoints(QPointF point){    mCenterPoint = point;    if(true == mIsFirstPoint)    {        mPrevCenterPoint = mCenterPoint;        mIsFirstPoint = false;    }    // 开始重绘    update();}void MainWindow::errProc(int err){    if(CFG::CAMERA_OPEN_FAILED == err)    {        QMessageBox::warning(this, "警告", "摄像头打开失败");    }}void MainWindow::on_btnStartTrack_clicked(){    emit startTrack();}



完整源码下载链接:

LED_track-20170209.rar

















0 0