目录

  • 前言
  • 效果图
  • 正文
    • 连接串口
    • 向串口写入命令
    • 举例设置的参数
      • ComBox类型
      • Int类型
  • 总结

前言

这篇文章的主要内容是完成对相机参数这部分的配置。因为这个相机参数这个接口的特殊原因,只能采用串口的形式才能对相机的参数进行设置,所以,需要具备一定的连接串口并使用串口发送信息的知识。话不多说,看代码~

效果图


因为这里的相机没有加光源和镜头,所以整体的效果看起来就是这样。

正文

连接串口

首先,我们当相机创建成功时,我们需要同时也连接上串口,从而让程序能够自动读取硬件上的参数,从而显示出正确的参数。串口的初始化如下:

void MDeviceE2v::InitSerialConfigure()
{m_pSerial->setPortName("COM3");if(m_pSerial->open(QIODevice::ReadWrite)){qint32 baudrate = 9600;m_pSerial->setBaudRate(baudrate);m_pSerial->setDataBits(QSerialPort::Data8);m_pSerial->setParity(QSerialPort::NoParity);m_pSerial->setStopBits(QSerialPort::OneStop);m_pSerial->setFlowControl(QSerialPort::NoFlowControl);}else{QMessageBox::information(NULL, "Error", "The Serial open fail.");qDebug()<<"The Serial open fail";}
}

连接串口,我们需要知道的参数有端口号,波特率,数据位,校验位,停止位。这就需要你提前知道了,可以从供应商那边知道。去网上找有很多这种demo,下一个下来就可以知道大概是怎么回事了。

向串口写入命令

注意,我们向串口写入指令要边写然后马上就读,不然,容易出现读错误的情况,我这里把写命令读串口数据封装成了一个接口函数,如下:

//向串口写命令
QString MDeviceE2v::WriteCmdToSerial(QString cmd)
{//qDebug()<<"MDeviceE2v::WriteCmdToSerial cmd"<<cmd;QByteArray bytes;bytes= (QByteArray)(cmd.toStdString().c_str());bytes.append("\r");QString cmd2 = (QString)bytes;bool reset = true;
RESET_CMD:qint32 nRet = -1;nRet = m_pSerial->write(bytes);//nRet返回实际写入的字节数QByteArray response_data;if(m_pSerial->waitForBytesWritten(3000)){while(m_pSerial->waitForReadyRead(500)){response_data += m_pSerial->readAll();if(response_data.size()>0){reset = false;}}}if(reset==true&&(nRet!=0)){reset = false;goto RESET_CMD;}QString response_dataStr;response_dataStr = QString::fromLocal8Bit(response_data);return response_dataStr;
}
  1. 接下来对这个函数进行一定的解释,首先,我需要对这个命令做一定的处理,因为文档要求传入的命令需要结尾有一个\r。不然,串口是无法识别命令的,所以,你一定要看清楚文档中的命令,有可能要求多一个回车符,多有可能,仔细一点总是没错的。不然,你会浪费很多时间去查问题。
  2. 然后,我就需要使用write这个函数把命令写入串口之中,然后,通过waitForBytesWrittenwaitForReadyRead这两个命令,产生一定的延时,然后,使用read去读取串口的命令。
  3. 最后,最好判断一下是否读到了数据,如果没读到的话,使用goto再写一次,读一次。确保读到你要的命令。

举例设置的参数

我这里基本把文档中给出的参数都给设置了,首先,先声明一下,因为无法得到每个参数前面的名字,所以,我使用让软件去读取xml文档,从而得到我想要的参数的名字。然后,里面的数据再是使用串口去读取。关于读取xml文档,将xml文档解析成不同的节点,就需要你自己去查询资料了,我这里里就不赘述了。我只列举一下,我设置了两个参数。先上代码:

ComBox类型

QString MDeviceE2v::GetOutputMode()
{QString cmd;cmd = "r mode\n";QString OutputMode  = WriteCmdToSerial(cmd);qint32 outputModeInt = GetRightNum(OutputMode);switch (outputModeInt) {case 0:return "Medium 4 Outputs 8bits";break;case 1:return "Medium 4 Outputs 12bits";break;case 2:return "Full 8 Outputs 8bits";break;case 3:return "Full Plus 10 Outputs 8bits";break;case 4:return "Medium 4 Outputs 10bits";break;case 5:return "Base 2 Outputs 8bits";break;case 6:return "Base 2 Outputs 10bits";break;case 7:return "Base 2 Outputs 12bits";break;}return "OutputMode Error";
}void MDeviceE2v::SetOutputMode(QString OutputMode)
{qDebug()<<"OutputMode"<<OutputMode;QString cmd;if(OutputMode=="Medium 4 Outputs 8bits"){cmd = "w mode 0\n";}else if(OutputMode=="Medium 4 Outputs 10bits"){cmd = "w mode 4\n";}else if(OutputMode=="Medium 4 Outputs 12bits"){cmd = "w mode 1\n";}else if(OutputMode=="Base 2 Outputs 8bits"){cmd = "w mode 5\n";}else if(OutputMode=="Base 2 Outputs 10bits"){cmd = "w mode 6\n";}else if(OutputMode =="Base 2 Outputs 12bits"){cmd = "w mode 7\n";}else if(OutputMode =="Full 8 Outputs 8bits"){cmd = "w mode 2\n";}else if(OutputMode =="Full Plus 10 Outputs 8bits"){cmd = "w mode 3\n";}else{cmd ="OutputMode error cmd";}QString response_data  = WriteCmdToSerial(cmd);if(!response_data.contains("Ok")){qDebug()<<"Error SetOutputMode fail";}
}

这是第一种,你需要写入命令,然后,它的返回值只会是单纯的一个数字,你需要进行一定的转换,从而得到你要的字符串,基本上对这种类型的参数都是这样做的。上面的GetRightNum这个函数是将得到的字符串做一定的分割,从而得到前面的数字。不然,它的字符串还是比较复杂的,没必要每个参数都写那么同样的几行代码,封装一下即可。

Int类型

这种类型就是使用具体的数字去控制的,这个相对于上面会简单一点,应该不难理解。接下来,上代码:

int   MDeviceE2v::GetGain()
{QString cmd;cmd = "r gain\n";QString Gain  = WriteCmdToSerial(cmd);int GainInt = GetRightNum(Gain);return GainInt;
}void   MDeviceE2v::SetGain(int Gain)
{qDebug()<<"SetGain"<<Gain;QString cmd;QString Gain2 = QString::number(Gain);cmd = "w gain "+Gain2;cmd = cmd.append('\n');qDebug()<<"SetGain cmd"<<cmd;QString response_data  = WriteCmdToSerial(cmd);qDebug()<<"SensorMode response_data"<<response_data;if(!response_data.contains("Ok")){qDebug()<<"Error SetGain fail";}
}

上面就是我列举的两种类型了,其实是还有Command型,和Boolean型,但Command型我没使用到,Boolean被我转换成ComBox型了,这就看你自己的操作了。

总结

关于参数的设置基本就完成了,有可能会遇到一些坑,但很多坑我都在文章中讲了,你可能需要细心一点看一下,其他遇到的,百度或谷歌也能解决,不过,最好还是看文档。
如果有需要可以去看看我的另外三篇文章。感谢您的观看~

MIL开发实践(1)——开发环境的设置
MIL开发实践(2)——MIL实时采图
MIL开发实践(3)——MIL触发采图

若有错误,欢迎指出,感谢~

MIL开发实践(4)——E2v相机参数相关推荐

  1. MIL开发实践(2)——MIL实时采图

    前言 前言 效果图 正文 初始化 实时采图 总结 前言 网上找到的关于MIL实时采图的代码基本上都是只有很老的代码,但其实MIL是有自带的关于采图方面的QT的demo的.这里给出地址,应该比一些普通的 ...

  2. MIL开发实践(1)——开发环境的设置

    目录 前言 软件安装 注意事项 MIL图像库函数说明 关于[MIL+QT实践教程](https://www.zhihu.com/column/c_1124353074277572608)的总结 MIL ...

  3. 大恒相机开发实践(3)——参数设置

    目录 前言 正文 初始化配置信息 创建Xml节点 创建节点下面的Attribute 总结 前言 这一部分的内容放在如何生成大恒相机的参数,但其实难点并不在我接下去写的部分.难点在于你获得了这个节点的N ...

  4. 大恒相机开发实践(1)——实时采图

    目录 前言 正文 准备工作 设备的初始化 设备信息的获取 实时采图 将采集到的Buffer传上显示层 总结 前言 本篇博客稍微记录一下我所写的插件.具体内容是有关于大恒相机的,关于这个相机,相信搜索到 ...

  5. 大恒相机开发实践(2)——触发采图

    目录 前言 正文 开启采图模式 开启实时采图功能 点击触发按钮 总结 前言 这部分完成的功能是触发采图,所谓触发采图,基本的过程是在先开启连续采图,然后,在某个触发信号到来的时候,读取其中的某一帧的信 ...

  6. 迈德威视工业相机python二次开发,修改相机参数

    迈德威视工业相机python二次开发,修改相机参数 1. 调用官方给的参考例程grab.py 例程下载地址:https://www.mindvision.com.cn/rjxz/list_12.asp ...

  7. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

  8. CameraX:Android 相机库开发实践

    前言 前段时间因为工作的需要对项目中的相机模块进行了优化,我们项目中的相机模块是基于开源库 CameraView 进行开发的.那次优化主要包括两个方面,一个是相机的启动速度,另一个是相机的拍摄的清晰度 ...

  9. 如何选择最佳的相机参数以实现最佳图像质量

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑丨3D视觉工坊 点击进入->3D视觉工坊学习交流群 在机器视觉领域中,相机是获取高质量图像的 ...

最新文章

  1. 利用 Android Studio 和 Gradle 打包多版本APK
  2. android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)
  3. 数据结构与算法 / 数组(Array)
  4. 以后的blog将转移到微信公众号,请扫码关注谢谢!
  5. windows服务器迁到_将文件服务器及域控制器从2003迁移至Windows Server 2008 R2
  6. HDU 6162 2017 多校训练:Ch's gift(树链剖分)
  7. 参数估计:文本分析的参数估计方法
  8. Atitit api与安全措施法 目录 1.1. 模板替换 sprintf %f %d 数字小数字段格式化转换校验法 1 2.  $pdo-exec 与query 2 2.1. 数字校
  9. metabase开源BI
  10. 深圳大学计算机与科学考研科目,2020深圳大学计算机专业课不考408了
  11. 每日一题---摔手机
  12. 信客 lt;文gt; 余秋雨
  13. python画动画爱心
  14. ”故乡飘已远,往意浩无边“
  15. STM32 ADC 单次模式、连续模式、扫描模式
  16. NPV(净现值)是什么以及其对应的概念及公式是什么?使用Python计算NPV是如何实现的?
  17. 机器学习基础——先验概率、后验概率和似然估计的讲解;频率派和贝叶斯派之分;以及MLE和MAP方法的解析
  18. VSCODE 配置cl.exe编译器
  19. ESP32基础应用之ESP32与阿里云物联网平台实现数据互传(MQTT协议)
  20. 什么是数据可视化,数据可视化有什么价值

热门文章

  1. mac打开java class文件出现乱码
  2. 英语里面关于钱数量的单词有哪些
  3. Miscellaneous | 转换字符串到整数
  4. 【Python】斐波那契数列之兔子问题
  5. 德州监管机构针对海外ICO活动下发禁令
  6. 赫德尔不等式泰纽斯基不等式
  7. 头歌实践教学平台答案(Java实训作业答案)
  8. n个小孩围成一圈,顺序报号,从第一个人开始报数(从1报到5),凡是报到5的人退出圈子,问最后留下的小孩原来是几号
  9. pythonpow函数用法_python pow函数底层实现原理
  10. Latex Visio画图边框删除