正运动技术
正运动技术

协助伙伴成功,是我们的价值所在

The value of Zmotion is to bring customers more success!

首页 / 支持与服务 / 技术分享

Technical support

技术分享

ZBasic结合Qt实现机器视觉数字识别

 

 1.png

  上期课程我们和大家分享了QT调用ZBasic语言的方法,即调用ZBasic语言封装的C++动态链接库,并实现机器视觉图像采集功能。

  本次课程我们将在上期课程的程序基础上,实现机器视觉数字识别的检测功能。

 《视频教程:ZBasic结合Qt实现机器视觉数字识别》

 

 2.png

 

 3.png

 

  (二)实例演示

  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界面。

  4.png

  

  

  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程序,并连接到控制器,进行对应采集操作。

  (三)仿真效果演示

  

  5.png

  

  本次,正运动技术ZBasic结合Qt实现机器视觉数字识别,就分享到这里。

  更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

  本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

  

  6.png

邮箱留言

Copyright © 2013 正运动技术有限公司 Design by Zmotion 版权所有   粤ICP备13037187号    Powered by www.zmotion.com.cn 运动控制器-运动控制卡

在线咨询