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

Posted somebot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹相关的知识,希望对你有一定的参考价值。

博主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

















以上是关于图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹的主要内容,如果未能解决你的问题,请参考以下文章

图像识别(13)——手势识别——用matchShapes识别手形数字

Apple Vision 框架:LCD/LED 数字识别

windows平台下基于QT和OpenCV搭建图像处理平台

图像识别技术在执法记录仪的应用

DirectX11第十篇 其他灯光类型——点光源

DirectX11第十篇 其他灯光类型——点光源