Dalsa线扫相机SDK二次开发_1

news/2025/2/27 16:01:14/文章来源:https://www.cnblogs.com/funiyi816/p/18741145

写在前面
本篇文章仅为工作记录,以下是本篇文章的开发环境
开发平台:Windows11
开发环境:QT5.15.2
开发语言:C++
编译器:MSVC 2019 64bit
线扫相机:LA-CM-16K05A-00-R
SDK版本:SaperaLTSDKSetup_8.20
采集卡:Xtium-CL_MX4

设计外触发之前要先确认内触发正常
内触发相关代码见上篇文章:Dalsa线扫相机SDK二次开发(内触发 QT开发)
刚开始接触外触发时我一直不理解外触发到底是怎样传递信号的,实操之后才明白了一些。简单来说,会有另一台控制器给采集卡发送PSO信号(高/低电平信号),如果将触发模式设置为高电平/低电平/上升沿/下降沿,那么在遇到对应的电流信号时采集卡会发送采集命令给相机,然后相机采图并将图像传给采集卡,这个时候如果不上传在采集卡数据(执行grab函数)到缓冲区,那你就无法图像数据,所以在给外触发信号之前一定要执行grab函数上传采集卡资源,这样等外触发信号来了之后才能收到采集的图像数据,外触发结束之后执行Freeze()函数停止上传采集卡资源。所以本质上在上篇内触发代码的基础上,将相机模式调整为外触发后,代码不用动直接运行,然后点击连续采图,接着给外触发信号,他就能根据外触发信号采图了,我这里根据工作需要做了一些改动。

相机类CCamera头文件接口
主要优化了一下接口,和内触发区别不大,部分代码如下:

enum ETriggerMode {internal, //内触发,即不需要触发,自动运行external, //外触发 (可能需要选择触发通道)
};class CCamera : public QObject
{Q_OBJECT
public:CCamera(QObject *parent = nullptr);~CCamera();bool init_camera();                                       //初始化设备bool stopGrab();                                          //关闭采集(内/外触发)bool startGrab();                                         //开启采集等待外触发信号bool grabOnce(int num);                                   //单步采集(内触发)bool grabContinues();                                     //持续采集(内/外触发)bool initDevice(char *m_serverName, const char *ccfPath); //初始化采集卡void free();                                                       //释放资源void saveImage();                                                  //保存图像数据void setETriggerMode(ETriggerMode mode);                           //设置触发模式void setConfigPath(std::string DevicePath, std::string ImagePath); //设置采集卡配置路径、图像保存路径private:std::string m_ccfPath{};                //配置文件路径std::string m_ImagePath{};              //图像保存路径char *m_ServerName{nullptr};            //服务器名称、即采集卡名称ETriggerMode m_mode{external};          //触发模式、默认是外触发SapAcquisition *m_Acquisition{nullptr}; //控制与板卡相连接的设备,即线扫相机,仅用于存储采集资源参数,SapBufferWithTrash *m_Buffers{nullptr}; //带垃圾缓冲区的buffer,(常用于处理速度跟不上数据采集速度时)SapTransfer *m_Xfer{nullptr};           //管理通用传输过程的功能,即将数据从一个源节点传输到目标节点的操作//SapView *m_View{nullptr};             //在窗口中显示SapBuffer对象的资源,
};

  

相机类部分实现
1、采集卡初始化:枚举连接到计算机上的采集卡设备->获取采集卡名称->打开采集卡设备
2、设置参数:采集卡所有参数信息都在配置文件中记录,可以打开 Sapera CamExpert设置相应的参数,然后保存到相应的配置文件中;
3、创建底层资源:主要是创建缓冲区、传输模式、注册回调函数,用来保存/转移图像数据,
4、采集图像:可以选择连续采集图像或者采集有限帧的图像序列,采图时可以选择等待时间/立即返回
代码相比内触发模式下仅有部分变动:
初始化时设置配置文件路径:

	std::string ccfPath = "E:\\ExternalConfig.ccf"; //配置文件路径std::string ImagePath = "D:\\test\\bmp\\";      //保存图像路径setConfigPath(ccfPath, ImagePath);

  配置路径setConfigPath函数:

void CCamera::setConfigPath(std::string DevicePath, std::string ImagePath) //采集卡配置文件、图像保存路径
{m_ccfPath = DevicePath;m_ImagePath = ImagePath;
}

  内/外触发模式下连续采集图像:由于内触发只是做测试没有别的操作,这里就没做复杂处理

bool CCamera::grabContinues() //连续传输
{bool isok = false;framcount = 0;if (internal == m_mode) {isok = startGrab();} else if (external == m_mode) {isok = startGrab();}qDebug() << "Start Grab Continues: " << isok;return isok;
}

  设置触发模式:

void CCamera::setETriggerMode(ETriggerMode mode) //设置触发模式
{m_mode = mode;
}

  其他也有些变动,但改动不大,自己对着改一下就行了,例如:saveImage里保存路径换成了m_ImagePath ,m_ImagePath 在初始化时设置为了你要保存的路径,

void CCamera::saveImage() //保存图像数据
{std::stringstream ss;ss << m_ImagePath << framcount << ".bmp";std::string name = ss.str();const char *savename = name.c_str();m_Buffers->Save(savename, "-format bmp"); //保存为bmp格式qDebug() << "framcount: " << framcount;framcount++;
}

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890671.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3安装配置+VSCode开发环境搭建,超详细保姆级教程(图文)

目录1. node.js 下载安装2. 查看 node.js 是否安装成功3. 配置 npm 下载的默认安装、缓存环境(1) 添加文件夹(2) 设置系统环境变量(3) 修改下载模块的存放路径4. npm 镜像源配置(1) 输入cmd打开命令提示符窗口,(2) 如果配置报错(3) 查看镜像配置是否成功5. 安装 vue-cli 工具6.…

Windows下Redis哨兵模式配置以及在.NetCore中使用StackExchange.Redis连接哨兵

一,Redis哨兵模式配置 1,下载Redis,然后解压复制5个文件夹分别如下命名。 2,哨兵模式配置 (1)修改主节点Redis-6379中redis.windows.conf配置文件如下 (2)修改从节点Redis-6380中redis.windows.conf配置文件如下(3)配置哨兵,在哨兵文件夹下添加Sentinel.conf配置文件…

zabbix监控http

一、模版复制与配置变更 1、模版复制2、修改宏 全克隆并修改好宏端口二、测试httpd服务状态 1、检查模块是否启用 apachectl -M | grep status修复 #ServerName www.example.com:80 ServerName 192.168.0.152:13000 重新执行后正常2、检查状态 http://112.81.86.33:13001/serve…

Ubuntu 22.04 或更高版本的系统中安装.NET Core 3.1的解决方案(使用1panel进行可视化演示)

第一步:先安装长期支持版本.NET 6 或更高 (这一步不是必须的,如果是干净的服务器建议这么做,因为安装完后会自动创建路径和环境变量方便后续操作)安装方法sudo apt update sudo apt install -y dotnet6如果安装时出现异常:A fatal error occurred. The folder [/usr/lib/dot…

考古新视野:LiDAR 揭开雨林下的玛雅古城!

一、当科技遇见文明:LiDAR 的考古革命茂密的雨林曾是考古学家的噩梦——藤蔓缠绕的树冠遮蔽了地面,人力勘探耗时费力,无数古代遗迹深藏其中。然而,激光雷达(LiDAR)技术的出现,如同一把“数字X光刀”,穿透了雨林的绿色屏障,将玛雅文明的失落之城从历史的尘埃中重新点亮…

mysql知识面试day2

mysql具有哪些锁 按锁的粒度分配:行级锁,表级锁,页级锁。mvcc的实现原理 MVCC--一份数据保留多个版本的一种方式,查询时通过readview和版本链获得对应版本的数据 好处:提升并发性能,对于高并发场景,mvcc比行级锁开销更小 实现原理 MVCC的实现依赖于版本链,版本链具有三个隐…

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索)

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server ——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索) 前排提示:本文撰写于 2025 年 2 月,仅仅离 Anthropic 发布的 MCP 协议过去不到 3 个月,因此本文很多接入 MCP 的方式还略显复杂。…

LLM大模型:deepseek浅度解析(四):Native Sparse Attention NSA原理

deepseek又整活了啊,2025.2.16的时候又发布了 "Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention",核心是解决attention计算耗时耗算力的问题!NSA具体又是怎么做的了?回忆一下:attention效果好的核心原因,就是Q*K得到了tok…

聊一聊:Air8000能解决哪些社会问题?

Air8000能解决什么社会问题呢?当前我们认为可以解决如下的问题: 问题一 硬件:成本高,备货压力大,稳定性差 嵌入式的一些常用的功能,比如GPIO、4G、Wi-Fi、蓝牙、定位、充电、升压、处理器等等,是项目上常用的功能。 如果每个都是模块,组合起来成本不菲。 Air8000的定价…

Open开发:CSDK与LuatOS的深度剖析

究竟要不要支持CSDK开发? 我们先来了解一下4G模组的软件架构。目前,4G模组内部的软件架构无一例外都是用C语言开发的,仅在底层使用了少量汇编语言。 从技术角度看,让用户使用C语言开发应用似乎顺理成章。毕竟C语言功能强大,运行效率极高。 然而,C语言在物联网行业的应用存…

硒鼓内部结构示意图和功能说明

公司有一台惠普打印机,型号:HP Color LaserJet MFP M281fdw,更换硒鼓的成本是打印机最大的支出,最近在研究自己给墨盒加粉,直接买碳粉+芯片成本还是比较乐观的。 这里说明下,为什么要买芯片,买回来的一个全新的硒鼓是带有芯片的,然后装上打印机,可以看到该墨盒的使用情…

浅析Golang的内存管理(下篇):go垃圾回收机制

文章目录三色标记算法 混合写屏障 并发、增量回收机制 GC触发时机go语言作为内存托管类型的开发语言,go runtime提供了自动的内存管理机制,无需程序员手动管理对象的内存释放,go runtime会在合适的时机自动释放不需要的内存对象。 一、三色标记算法传统的内存对象标记算法早…