当前位置:   article > 正文

基于Vs+Qt的工业相机界面开发demo(一)_qt camera demo

qt camera demo

1、开发环境

vs2017

Qt5.12.5

opencv4.0

海康相机sdk

链接:https://pan.baidu.com/s/1QsOskg9hAjOK0pC1hDqaqA 提取码:zfkk

自行安装

OpenCV4+VS2015的配置

2、预备知识

本节我们将学习Qt的基本操作,本项目需要使用的主要的知识:信号与槽机制、多线程,下面通过两个简单的例子熟悉QtCreator开发环境。

QT教程-快速入门

QT信号槽概念原理讲解

介绍:Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序。

2.1 第一个程序 :hello World

单击 Qt Creator 的菜单项文件->新建文件或项目,出现如图 1 所示的对话框。在这个对话框里选择需要创建的项目或文件的模板。

        图1  新建文件或项目对话框

                                                                 

 图 2 新建项目向导第 1 步:项目名称和项目存储位置设置标题

                                       

图3

                                                                             

     图4

                                                                             

图5 选择编译工具

                                                                           

标图6 完成创建项目题

                                                                                

项目管理与文件编辑界面

点击Start debugging of startup project运行一下,会弹出一个空白的窗口。

标图 7 项目管理与文件编辑界面题

                                                                               

                                          

 图8 debug运行的空白窗口

                                                                                 


接下来我们将在该空白窗口中添加各种所需要的控件。

双击文件目录树中的文件 demowidget1.ui,出现如图10所示的窗体设计界面.

  图9

                                                                                           

 图10

                                                                                               

简单介绍的我们需要使用的界面控件。

Push Button:普通按钮

Label:可以显示文字、图片、动图。

Line Edit : 单行文本编辑框,可以输入单行文本;

图11
图12
图13

再次Debug,Qt会自动帮我们生成界面Ui相关的C++代码 

图14
图15

下面要实现两个功能:

1、点击bnt_click后在label_display中显示“ Hello World!!

2、在lineEdit_input输入字符串就在label_display中显示该字符串。

信号与槽机制

信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。

GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

下面实现第一个功能 

首先声明槽函数

  1. #ifndef DEMOWIDGET1_H
  2. #define DEMOWIDGET1_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class DemoWidget1; }
  6. QT_END_NAMESPACE
  7. class DemoWidget1 : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. DemoWidget1(QWidget *parent = nullptr);
  12. ~DemoWidget1();
  13. private:
  14. Ui::DemoWidget1 *ui;
  15. // 声明我们的槽函数
  16. public slots:
  17. void on_bnt_click(); // PushButton按键响应的槽函数
  18. void on_lineEdit_input(); // lineEdit输入响应的槽函数
  19. };
  20. #endif // DEMOWIDGET1_H

然后定义槽函数

 

多线程(重点!敲黑板)

 mythread.h

  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QObject>
  4. #include <QWidget>
  5. #include <QThread>
  6. class Mythread : public QThread
  7. {
  8. Q_OBJECT
  9. public:
  10. explicit Mythread(QObject *parent = nullptr);
  11. public:
  12. void run();
  13. public:
  14. int thread_count;
  15. signals:
  16. void mySinal();//信号
  17. void mySinal_param(int thread_count);
  18. public slots:
  19. };
  20. #endif // MYTHREAD_H

mythread.cpp 

  1. #include "mythread.h"
  2. Mythread::Mythread(QObject *parent) : QThread(parent)
  3. {
  4. }
  5. void Mythread::run()
  6. {
  7. int mythread_count=0;
  8. while (!isInterruptionRequested())
  9. {
  10. mythread_count = mythread_count + 5;
  11. emit mySinal();//发送信号
  12. emit mySinal_param( mythread_count );//发送含参数的信号
  13. msleep(100);
  14. }
  15. }
demowidget1.h
  1. #ifndef DEMOWIDGET1_H
  2. #define DEMOWIDGET1_H
  3. #include <QWidget>
  4. #include <mythread.h>
  5. QT_BEGIN_NAMESPACE
  6. namespace Ui { class DemoWidget1; }
  7. QT_END_NAMESPACE
  8. class DemoWidget1 : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. DemoWidget1(QWidget *parent = nullptr);
  13. ~DemoWidget1();
  14. private:
  15. Ui::DemoWidget1 *ui;
  16. // 声明我们的槽函数
  17. public slots:
  18. void on_bnt_click(); // PushButton按键响应的槽函数
  19. void on_lineEdit_input(); // lineEdit输入响应的槽函数
  20. void on_bnt_startThread();
  21. void on_bnt_stopThread();
  22. // 声明需要在线程中执行的耗时函数
  23. void long_Time_Operate();
  24. void long_Time_Operate(int count);//重载
  25. public:
  26. Mythread* mythread = NULL;// 线程指针
  27. int count = 0;
  28. };
  29. #endif // DEMOWIDGET1_H

demowidget1.cpp

  1. #include "demowidget1.h"
  2. #include "ui_demowidget1.h"
  3. #include <windows.h>
  4. DemoWidget1::DemoWidget1(QWidget *parent)
  5. : QWidget(parent)
  6. , ui(new Ui::DemoWidget1)
  7. {
  8. ui->setupUi(this);
  9. int count;
  10. mythread = new Mythread; //左相机线程对象
  11. // 绑定信号与槽函数
  12. connect(ui->bnt_click,SIGNAL(clicked()),this,SLOT(on_bnt_click()));
  13. connect(ui->lineEdit_input,SIGNAL(editingFinished()),this,SLOT(on_lineEdit_input()));
  14. connect(ui->bnt_startThread,SIGNAL(clicked()),this,SLOT(on_bnt_startThread()));
  15. connect(mythread,SIGNAL(mySinal()),this,SLOT(long_Time_Operate())); //线程的信号与对应的槽
  16. connect(mythread,SIGNAL(mySinal_param(int)),this,SLOT(long_Time_Operate(int)));//线程的信号与对应的槽
  17. connect(ui->bnt_stopThread,SIGNAL(clicked()),this,SLOT(on_bnt_stopThread()));
  18. }
  19. DemoWidget1::~DemoWidget1()
  20. {
  21. delete ui;
  22. }
  23. void DemoWidget1::on_bnt_click()
  24. {
  25. ui->label_diplay->setText("Hello World!!");
  26. QFont font;
  27. font.setPointSize(45);
  28. font.setBold(true);
  29. font.setWeight(75);
  30. ui->label_diplay->setFont(font);
  31. }
  32. void DemoWidget1::on_lineEdit_input()
  33. {
  34. QString str = ui->lineEdit_input->text(); // 读取输入字符串
  35. ui->label_diplay->setText(str);
  36. QFont font;
  37. font.setPointSize(45);
  38. font.setBold(true);
  39. font.setWeight(75);
  40. ui->label_diplay->setFont(font);
  41. }
  42. //void DemoWidget1::on_bnt_startThread()
  43. //{
  44. // QString str ;
  45. // QFont font;
  46. // font.setPointSize(40);
  47. // font.setBold(true);
  48. // font.setWeight(75);
  49. // ui->label_diplay2->setFont(font);
  50. // for(int i=0; i<100 ;i++) // 循环
  51. // {
  52. // QString ii = QString("%4").arg(i);
  53. // ui->label_diplay2->setText(ii);
  54. // QThread::msleep(50);// 延时
  55. // }
  56. //}
  57. void DemoWidget1::on_bnt_startThread() // 只负责开启线程
  58. {
  59. if (!mythread->isRunning())
  60. {
  61. mythread->start();
  62. ui->label_diplay2->setText("my thread start");
  63. }
  64. }
  65. void DemoWidget1::on_bnt_stopThread()
  66. {
  67. if(!mythread->isInterruptionRequested())
  68. {
  69. mythread->requestInterruption();
  70. mythread->wait();
  71. }
  72. }
  73. void DemoWidget1::long_Time_Operate()
  74. {
  75. QString str ;
  76. QFont font;
  77. font.setPointSize(72);
  78. font.setBold(true);
  79. font.setWeight(75);
  80. ui->label_diplay2->setFont(font);
  81. ui->label_diplay2->setText("long_Time_Operate");
  82. count++;
  83. QString ii = QString("%4").arg(count);
  84. ui->label_diplay2->setText(ii);
  85. }
  86. void DemoWidget1::long_Time_Operate(int new_count)
  87. {
  88. QString str ;
  89. QFont font;
  90. font.setPointSize(72);
  91. font.setBold(true);
  92. font.setWeight(75);
  93. ui->label->setFont(font);
  94. ui->label->setText("long_Time_Operate");
  95. QString ii = QString("%4").arg(new_count);
  96. ui->label->setText(ii);
  97. }
 

3、相机界面开发

参照相机SDK实现工业相机基本操作功能以及单相机标定

张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/601021
推荐阅读
相关标签
  

闽ICP备14008679号