看过我之前的博客的人应该知道我最近在处理利用halcon绑定窗口的时候遇到放大多倍的情况,最近突然想到错误在哪里了,顺便我同时也写一个关于使用多线程读相机的程序,当然在实际项目中,读相机基本都要用多线程来读取,并根据按钮的进行图像处理。
还是按照惯例直接上演示,当然最近光源出现一些问题,所以有黑边,但是我还在找调节器说明书(其实是没找到)。
直接上代码:
mythreadd这个是子线程程序。
mythreadd.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
# include "HalconCpp.h"
# include "HDevThread.h"//halcon头文件
#include <qlabel.h>
#include <qdebug.h>
#include <QCoreApplication>
#include <QTimer>
#include <qdebug.h>
using namespace HalconCpp;
class MyThreadd : public QWidget
{
Q_OBJECT
public:
MyThreadd(QWidget *parent = 0);//注意父要等于0;
~MyThreadd();
HObject ho_Image, ho_GrayImage, ho_Regions, ho_RegionOpening, ho_ConnectedRegions;
HTuple hv_AcqHandle, hv_Number, hv_WindowHandle ,x,y;//halcon的程序。
void read_image(QLabel *label_);//读相机的函数;
void sum_image(QLabel*label_1);//对单帧进行计数处理
void stop_image();//关闭相机
private:
QTimer *timer;//定义时钟
bool isStop=true;
signals:
void mySignal();
private slots:
void camera();//显示相机画面程序
};
#endif // MYTHREAD_H
reg.h
#ifndef REG_H
#define REG_H
#include <halconcpp/HalconCpp.h>
#include "halconcpp.h"
#include <qgridlayout.h>
#include <QHBoxLayout>
#include <qpushbutton.h>
#include <QtWidgets/QWidget>
#include "mythreadd.h"
#include <qthread.h>
#include <qlabel.h>
#include <QGroupBox>
#include <qtimer.h>
#include <QCoreApplication>
using namespace HalconCpp;
class reg : public QWidget
{
Q_OBJECT
public:
explicit reg(QWidget *parent = Q_NULLPTR);
~reg();
void begin();
private:
QLabel *label;
QLabel *label2;
QLabel *label3;
QLabel *label4;//ui控件
private:
MyThreadd *myT;
QThread *thread;//定义子线程
};
#endif // REG_H
main.cpp
#include "reg.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
reg w;
w.show();
return a.exec();
}
mythreadd.cpp
#include "mythreadd.h"
#include "reg.h"
MyThreadd::MyThreadd(QWidget *parent)
: QWidget(parent)
{
timer = new QTimer();//定义时钟
connect(timer, SIGNAL(timeout()), this, SLOT(camera()));//利用时钟跳动显示相机
}
MyThreadd::~MyThreadd()
{
}
void MyThreadd::read_image(QLabel *label_)
{
int k=20;
timer->start(k);
/时钟循环
OpenFramegrabber("USB3Vision", 0, 0, 0, 0, 0, 0, "progressive", -1, "default",
-1, "false", "default", "2BDF59880598_U3V_MVCE12010UM", 0, -1, &hv_AcqHandle);//打开相机
GrabImageStart(hv_AcqHandle, -1);
GrabImageAsync(&ho_Image, hv_AcqHandle, -1);
long windowID = label_->winId();
OpenWindow(0, 0, label_->height(), label_->width(), windowID, "visible", "", &hv_WindowHandle);//绑定窗口
HDevWindowStack::Push(hv_WindowHandle);
}
void MyThreadd::sum_image(QLabel *label_1)
{
///halcon的处理仅局限于我对瓶盖的简单处理
Rgb1ToGray(ho_Image, &ho_GrayImage);
Threshold(ho_GrayImage, &ho_Regions, 151, 255);
OpeningCircle(ho_Regions, &ho_RegionOpening, 8);
Connection(ho_RegionOpening, &ho_ConnectedRegions);
CountObj(ho_ConnectedRegions, &hv_Number);///halcon的相关处理
/
int a = hv_Number;
label_1->setText(QString::number(a));//计数显示
}
void MyThreadd::stop_image()
{
timer->stop();//结束时钟
CloseFramegrabber(hv_AcqHandle);//关闭相机
}
void MyThreadd::camera()
{
GetImageSize(ho_Image, &x, &y);
SetPart(hv_WindowHandle, 0, 0, y, x);//读取图像的大小,并应用到窗口
GrabImage(&ho_Image, hv_AcqHandle);
DispObj(ho_Image, hv_WindowHandle);//显示画面
}
reg.cpp
#include "reg.h"
reg::reg(QWidget *parent)
: QWidget(parent)
{
//简单的ui部分
QGridLayout *gridLayout = new QGridLayout(this);
gridLayout->setSpacing(100);
QHBoxLayout *vLayout_1 = new QHBoxLayout;
QHBoxLayout *vLayout_2 = new QHBoxLayout;
QGroupBox *GroupBox_1 = new QGroupBox(QStringLiteral("图像部分"));
QGroupBox *GroupBox_2 = new QGroupBox(QStringLiteral("按钮部分"));
QPushButton *btn_1 = new QPushButton(QStringLiteral("读图"));
QPushButton *btn_4 = new QPushButton(QStringLiteral("计数"));
QPushButton *btn_5 = new QPushButton(QStringLiteral("关闭相机"));
label2 = new QLabel(QString::fromLocal8Bit("初始图像"));
label2->setFixedSize(200, 200);
label = new QLabel(QStringLiteral("计数"));
label->setFixedSize(200, 200);
vLayout_1->addWidget(label2);
vLayout_1->addWidget(label);
vLayout_2->addWidget(btn_1);
vLayout_2->addWidget(btn_4);
vLayout_2->addWidget(btn_5);
GroupBox_1->setLayout(vLayout_1);
GroupBox_2->setLayout(vLayout_2);
gridLayout->addWidget(GroupBox_2, 0, 0);
gridLayout->addWidget(GroupBox_1, 0, 1);
/****************************************************************************************************/
myT = new MyThreadd;
thread = new QThread;//定义线程
myT->moveToThread(thread);
connect(btn_1, &QPushButton::clicked, myT, [=]()//点击按钮1;
{
thread->start();//线程开始
myT->read_image(label2);//进入子程序读取相机
});
connect(btn_4, &QPushButton::clicked, myT, [=]()
{
myT->sum_image(label);
});
connect(btn_5, &QPushButton::clicked, myT, [=]()
{
myT->stop_image();
thread->quit();
thread->wait();
});
}
reg::~reg()
{
}
当然现在我在写这个文章,我还遇到了一个新的问题,就是我点击关闭相机后,在重新打开相机我那个label控件的画面不会重新变化,问题先放在这里,如果我解决的话,我在发一篇博客吧。