浅谈在qt项目内使用多线程实时显示halcon相机,并实现实时计数。

17 篇文章 3 订阅
6 篇文章 0 订阅

看过我之前的博客的人应该知道我最近在处理利用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控件的画面不会重新变化,问题先放在这里,如果我解决的话,我在发一篇博客吧。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值