The value of Zmotion is to bring customers more success!
上期课程我们和大家分享了QT调用ZBasic语言的方法,即调用ZBasic语言封装的C++动态链接库,并实现机器视觉图像采集功能。
本次课程我们将在上期课程的程序基础上,实现机器视觉数字识别的检测功能。
(二)实例演示
1.打开ZDevelop软件,打开上次课程使用到的图像采集项目,添加使用到的全局变量,添加【测试】功能子程序、【连续运行】子程序、【停止运行】子程序。
2.打开QTCreator软件,点击“Open Project”,在指定路径下找到上次课程的项目文件“QT_ZVision_1”并打开项目。
3.在“mainwindow.cpp”文件中增加定义程序中使用到的全局变量。
int flag=0;
ZMC_HANDLE g_handle;
int Times=0;
uint8 zv0_pBuff[520*390*2]={0};//锁存0缓存大小
int ContinuousGetImgFlag=0; //连续采集标志
int ContinuousRunFlag=0; //连续运行标志
4.补充设计UI界面。
5.添加界面初始化代码。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//ui->ZV0->setText(""); //清空字体
//ui->ZV0->setStyleSheet("QLabel{background-color:rgb(0, 0, 100);}"); //设置样式表
ui->select_mode->addItem("手动阈值",0);
ui->select_mode->addItem("自动阈值",1);
ui->ExposureValue->setText("5000");
UpZV_0.start(20);//20ms定时判断采集并显示图像
connect(&UpZV_0, SIGNAL(timeout()), this, SLOT(UpZV_0show()));
}
6.添加【测试】槽函数:选择【测试】按钮,右击弹出快捷菜单栏,选择“转到槽”选项→弹出“转到槽”窗口,选择对应的信号源“clicked()”,点击“OK”确认,即可完成槽函数的定义和声明→在槽函数的声明函数中添加函数实现的具体代码内容。
//单次执行函数
void MainWindow::on_execute_once_clicked()
{
int32 iresult;
//将QT界面设置的参数写入控制器对应变量中
int mode,low_thresh,high_thresh,min_area,max_area;
mode=ui->select_mode->currentIndex();
ZAux_Direct_SetVariableInt(g_handle,"d_detect_param(0)",mode);
low_thresh=ui->low_thresh_value->value();
ZAux_Direct_SetVariableInt(g_handle,"d_detect_param(1)",low_thresh);
high_thresh=ui->hige_thresh_value->value();
ZAux_Direct_SetVariableInt(g_handle,"d_detect_param(2)",high_thresh);
min_area=ui->min_area->value();
ZAux_Direct_SetVariableInt(g_handle,"d_detect_param(3)",min_area);
max_area=ui->max_area->value();
ZAux_Direct_SetVariableInt(g_handle,"d_detect_param(4)",max_area);
iresult=ZAux_RunTask(g_handle,0,"btn_test()");//运行控制器里面指定的SUB
if (iresult==0)
{
qDebug()<<"run btn_test() success";
}
else
{
qDebug()<<"run btn_test() fail !!"<<iresult;< p="">
}
ZV0_Show();//刷新显示界面图像
}
7.添加【连续运行】槽函数:选择【连续运行】按钮,右击弹出快捷菜单栏,选择“转到槽”选项→弹出“转到槽”窗口,选择对应的信号源“clicked()”,点击“OK”确认,即可完成槽函数的定义和声明→在槽函数的声明函数中添加函数实现的具体代码内容。
//连续运行
void MainWindow::on_run_clicked()
{
int32 iresult;
iresult=ZAux_RunTask(g_handle, 0, "btn_run()"); //运行控制器里面指定的SUB
if (iresult== 0)
{
qDebug()<< "run btn_run() success";
}
else
{
qDebug()<< "run btn_run() fail !!"<<iresult;
}
ContinuousRunFlag= 1; //连续运行标志置1
}
8.添加定时刷新函数:在“mainwindow.h”文件中定义“QTimer Uprun_0”定时器变量→在界面初始化函数中添加定时器触发条件和信号与槽连接函数→添加定时检测识别骰子点数的定义和声明函数,并在声明函数中添加具体的实现代码内容。
private:
Ui::MainWindow *ui;
QPixmap fPixmap;
QTimer UpZV_0;
QTimer Uprun_0;
MainWindow::MainWindow(QWidget * parent) :
QMainWindow( parent),
ui( new Ui::MainWindow)
{
ui->setupUi(this);
//ui->ZV0->setText(""); //清空字体
//ui->ZV0->setStyleSheet("QLabel{background-color:rgb(0, 0, 100);}"); //设置样式表
ui->select_mode->addItem( "手动阈值", 0);
ui->select_mode->addItem( "自动阈值", 1);
ui->ExposureValue->setText( "5000");
UpZV_0.start( 20); //20ms定时判断采集并显示图像
connect(&UpZV_0, SIGNAL(timeout()), this, SLOT(UpZV_0show()));
Uprun_0.start( 200); //200ms定时判断采集并显示图像
connect(&Uprun_0, SIGNAL(timeout()), this, SLOT(Uprun_show()));
}
//定时器开启连续运行
void MainWindow::Uprun_show()
{
if( 1 == ContinuousRunFlag)
{
ZV0_Show();
}
}
9.添加【停止运行】槽函数:选择【停止运行】按钮,右击弹出快捷菜单栏,选择“转到槽”选项→弹出“转到槽”窗口,选择对应的信号源“clicked()”,点击“OK”确认,即可完成槽函数的定义和声明→在槽函数的声明函数中添加函数实现的具体代码内容。
//停止运行
void MainWindow::on_stop_clicked()
{
int32 iresult;
iresult=ZAux_RunTask(g_handle,0,"btn_stop()");//运行控制器里面指定的SUB
if (iresult==0)
{
qDebug()<<"run btn_stop() success";
}
else
{
qDebug()<<"run btn_stop() fail !!"<<iresult;< p="">
}
ContinuousRunFlag=0;//连续运行标志置0
}
10.查看运行效果:将控制器接入电源,使用网线将控制器与PC连接,将相机通电并接入控制器→使用ZDevelop软件打开ZBasic自动识别骰子点数的项目文件,将该项目下载到控制器→运行QT程序,并连接到控制器,进行对应采集操作。
(三)仿真效果演示
本次,正运动技术ZBasic结合Qt实现机器视觉数字识别,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。