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

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

#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

















你可能感兴趣的:(openCV,图像识别)