深视 线扫相机 获取点云数据

Qt hello - 专注于Qt的技术分享平台

最近项目上用到了深视的线扫相机,集成了三天才搞定,分享下代码。

顺便吐槽一下,想用相机取图,这么简单的功能,搞得如此麻烦。

1,文档有三份,就不能集成到一份么,维护起来也简单。

2,并且文档不更新,我看了好久,按照文档开发,结果不行,技术说文档太旧了。

3,文档里好多代码,特别多的魔数,突然出现一个数字,也不解释啥意思。

4,获取点云应该是一个常见的需求,但是接口不能直接获取,还需要自己运算,直接提供一个接口给到客户不是更好么。

一,打开相机

int Open() {if (StartStatus)return 0;std::regex pattern("((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)");if (!regex_match(_Address, pattern)){std::cout << "Error _Address:" << _Address << std::endl;return -1;}//sdk dll 连接参数配置SR7IF_ETHERNET_CONFIG SREthernetConFig;//获取IP控件地址4个值std::vector<std::string> ip_list = SplitString(_Address, ".");for (unsigned int i = 0; i < 4; i++){SREthernetConFig.abyIpAddress[i] = std::atoi(ip_list[i].c_str());}//连接相机 int reT = SR7IF_EthernetOpen(SR_DEVICEID, &SREthernetConFig);if (reT < 0)   //失败{std::cout << "connect sr error: " << reT << std::endl;return -1;}else {std::cout << "connect sr ok " << reT << std::endl;}//批处理输出 轮廓+亮度int pData = 0;SR7IF_SetSetting(SR_DEVICEID, 0x02, 0x10, 0x00, 0x21, 0, &pData, 1);//循环 关int cycle = 0;SR7IF_SetSetting(SR_DEVICEID, 0x02, 0x10, 0x00, 0x10, 0, &cycle, 1);StartStatus = true;return 0;}

二,获取数据 

我这里使用阻塞方式获取数据。他们还提供了非阻塞也就是回调方式获取数据,但是我的代码在线程同步的时候经常崩溃,没找到原因。还有一种是无线循环获取数据,我这里也没跑通,出来的数据不对。

int interface_sr::getData() {//获取参数std::vector<std::string> listParameter =  SplitString(privateParameter,":");if (listParameter.size() == 2) {if (listParameter.at(0) == "BatchPoints") {int BatchPoints = std::stoi(listParameter.at(1));std::cout << "set BatchPoints " << BatchPoints << std::endl;//批处理点数SR7IF_SetSetting(SR_DEVICEID, 0x02, 0x10, 0x00, 0x0a, 0, &BatchPoints, 2);}}//开始批处理SR7IF_StartMeasure(SR_DEVICEID, 50000);SR7IF_Data DataObject = NULL;int res= SR7IF_ReceiveData(SR_DEVICEID, DataObject);if (res != 0) {std::cout << "SR7IF_ReceiveData error:" << res << std::endl;return -1;}int BatchPoint = SR7IF_ProfilePointSetCount(SR_DEVICEID, DataObject);int DataWidth = SR7IF_ProfileDataWidth(SR_DEVICEID, DataObject);//高度数据int* heightData = new int[BatchPoint * DataWidth];res = SR7IF_GetProfileData(SR_DEVICEID, DataObject, heightData);if (res != 0) {std::cout << "SR7IF_GetProfileData error:" << res << std::endl;return -1;}//灰度数据unsigned char* grayData = new unsigned char[BatchPoint * DataWidth];res = SR7IF_GetIntensityData(SR_DEVICEID, DataObject, grayData);if (res != 0) {std::cout << "SR7IF_GetIntensityData error:" << res << std::endl;return -1;}double xpitch = SR7IF_ProfileData_XPitch(SR_DEVICEID, DataObject);double ypitch = xpitch;int width = DataWidth;int height = BatchPoint;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud <pcl::PointXYZ>);std::vector<cv::Point3f> points;for (int i = 0; i < width * height; i++) {double x, y, z;x = i % width * xpitch;     //x 坐标y = i / width * ypitch;     //y 坐标z = (double)(heightData[i] / 100000.0 ); //z  转成mm为单位points.push_back(cv::Point3f(x, y, z));pcl::PointXYZ point(x, y, z);cloud->points.push_back(point);}//保存点云pcl::io::savePLYFileBinary("point_cloud.ply", *cloud);//点云cv::Mat tempCloudImage = cv::Mat(cv::Size(width, height), CV_32FC3, points.data());//深度cv::Mat tempDepthImage = cv::Mat(cv::Size(width, height), CV_32FC1, cv::Scalar(0));for (int i = 0; i < height; ++i) {for (int j = 0; j < width; ++j) {int index = i * width + j;tempDepthImage.at<float>(i, j) = (double)(heightData[index] / 100000.0 );}}//灰度图cv::Mat tempGrayImage = cv::Mat(cv::Size(DataWidth, BatchPoint), CV_8UC1, const_cast<unsigned char*>(grayData));SR7IF_StopMeasure(SR_DEVICEID);delete[] heightData;delete[] grayData;return 0;}

Qt hello - 专注于Qt的技术分享平台

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

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

相关文章

【计算机毕业设计】springboot反诈科普平台的设计与实现

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低反诈科普平台的运营人员成本&#xff0c;实现了反诈科普平台的 标准化、制度化、程序化的管理&#xff0c;有效地防止了反诈科普平台的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够…

python中字符串的 format() 方法

文章目录 前言1、位置参数2、索引参数3、命名参数3、格式化参数 前言 format() 是 Python 字符串对象的方法&#xff0c;用于将值插入到格式化字符串的占位符中。它是一种灵活和强大的字符串格式化工具。format() 方法可以在字符串中使用占位符 {}&#xff0c;并通过传递参数将…

[vue] nvm

nvm ls // 看安装的所有node.js的版本nvm list available // 查显示可以安装的所有node.js的版本可以在可选列表里。选择任意版本安装&#xff0c;比如安装16.15.0 执行&#xff1a; nvm install 16.15.0安装好了之后。可以执行&#xff1a; …

字符数组以及字符串相关的几个函数

一.字符数组 1.定义&#xff1a;格式如下 char a[10]; //此处就表示定义了一个长度为10的字符数组 2.引用&#xff1a; 也和其余的数组一样&#xff0c;是下标引用。 3.初始化&#xff1a; 如下代码为字符数组初始化的几种情况&#xff1a; int main() {char arr[5] {…

25考研英语长难句Day03

25考研英语长难句Day03 【a.词组】【b.断句】 多亏了电子学和微力学的不断小型化&#xff0c;现在已经有一些机器人系统可以进行精确到毫米以下的脑部和骨骼手术&#xff0c;比技术高超的医生用手能做到的精确得多。 【a.词组】 词组翻译thanks to多亏了&#xff0c;由于cont…

【JavaEE进阶】 Bean的作用域与生命周期

文章目录 &#x1f343;Bean的作用域&#x1f6a9;作用域的使用&#x1f6a9;观察Bean的作用域&#x1f388;单例作用域&#x1f388;多例作用域&#x1f388;请求作用域&#x1f388;会话作⽤域&#x1f388;Application作⽤域 &#x1f384;Bean的⽣命周期⭕总结 &#x1f34…

win11家庭中文版安装docker,报错 Docker Engine stopped

先引一下这位博主的链接超详细Windows11家庭中文版系统安装Docker-20230401_windows11安装docker-CSDN博客&#xff0c;我到前五步(跳出页面重启)和博主都是一样的&#xff0c;但是第六步我并没有报错&#xff0c;直接跳出docker界面 记录一下我的解决办法&#xff0c;首先按照…

金价又双叒涨了!现货黄金什么比较好

虽然近期有新闻显示&#xff0c;国内的实物黄金价格出现大幅的下跌&#xff0c;但是从整体看&#xff0c;多个黄金投资品种的长期上升趋势还是比较稳定的&#xff0c;因此我们会看到&#xff0c;很多投资者会趁现在这波下跌重新入场做多。那么投资黄金买什么比较好呢&#xff1…

Java中的类与对象-深入探索

在Java编程的世界里&#xff0c;类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;是两个核心概念。它们是面向对象编程&#xff08;OOP&#xff09;的基石&#xff0c;使得Java能够处理复杂的数据结构和交互。本文将深入解析Java中的类和对象&#xff0c;…

浅述遥感技术在农业领域的应用

虽久未更新&#xff0c;但本文依旧延续以前叙述风格&#xff0c;即以通俗易懂方式描述关键问题。 本文章节安排如下&#xff1a; 简述背景&#xff1b;介绍在农业领域的主要应用技术的关键问题&#xff1b;总结和实例介绍。 1 背景描述-何为遥感图像&#xff1f; 一般来说&a…

如何向全国各大新闻网站投稿?

在信息爆炸的时代,新闻媒体的投稿工作对于单位的信息宣传员来说,既是一项重要的职责,也是一项充满挑战的任务。作为一名信息宣传员,我负责着单位的对外信息宣传投稿工作,每个月都需要在各大媒体上发表文章,以展示单位的成果和风采。 然而,刚开始的投稿之路并不顺畅。我习惯性地…

4种企业防泄密的办法,强烈推荐第二种

4种企业防泄密的办法&#xff0c;强烈推荐第二种 企业信息泄密常见的原因有内部人员、黑客、违规收集信息、第三方合作商&#xff0c;以下将为你详细分析这些泄密原因以及应对的方法。 1、内部人员泄密 内部员工由于能够接触到敏感数据&#xff0c;成为主要的泄露数据群体。这…

springboot 序列化和反序列化

介绍 在Java中&#xff0c;序列化和反序列化是一种将对象转换为字节流或将字节流转换为对象的机制。通过序列化&#xff0c;可以将对象存储到文件中、传输到网络上&#xff0c;或者在分布式系统中进行对象的传递。本文将详细介绍Java序列化和反序列化的原理、使用方法和常见应用…

优路教育:以实干、创新、永不言败的精神内核,推动新时代职教发展

随着“教育家精神”的提出&#xff0c;新时代下人民教师的职业内涵更为丰富&#xff0c;同时也被赋予了更为崇高的教育使命。强教必先强师&#xff0c;加强教师队伍建设是建设教育强国重要的基础工作。由此&#xff0c;打造一批勤勉敬业、创新实干的教师队伍&#xff0c;成为了…

2024最新洗地机推荐,洗地机怎么选?热门品牌哪个最好用?

在现代生活中&#xff0c;忙碌的日常让家庭清洁变得更加繁重和耗时。然而&#xff0c;洗地机的引入彻底改变了这一状况。凭借其强大的清洁效果和简便的使用方式&#xff0c;洗地机能够迅速清除地面上的各种污垢&#xff0c;使清洁工作变得轻松自如。正因为如此&#xff0c;洗地…

JWT生成token工具类实现

JWT简介 JWT定义 JWT全称为Json web token&#xff0c;也就是 Json 格式的 web token JWT数据结构 1.JWT由三段字符串组成&#xff0c;中间用.分隔 Project_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzE2MzcwMTM0LCJpYXQiOjE3MTU3NjUzMzQsImp0aSI6IjllO…

cookie,session, token 的特点与区别

Cookie、Session 和 Token 在 Web 开发中扮演着不同的角色&#xff0c;各自具有特点和区别&#xff1a; Cookie 存储在用户的浏览器中&#xff0c;是由服务器发送到客户端并存储在客户端的小型文本文件。可以包含有关用户的信息&#xff0c;如身份验证令牌、用户偏好设置等。可…

MySQL触发器 ,视图索引 , 事务

MySQL进阶二 补充触发器知识 # 删除触发器代码 drop trigger 触发器名;# 当一个学员发生转班&#xff0c;班级对应的总数进行同步变化# 当一个学员发生转班&#xff0c;班级对应的总数进行同步变化delimiter !!create trigger movestudent after update on stu1 for each ROW…

力扣HOT100 - 152. 乘积最大子数组

解题思路&#xff1a; 方法一&#xff1a;暴力 class Solution {public int maxProduct(int[] nums) {int max Integer.MIN_VALUE;int s 1;for (int i 0; i < nums.length; i) {s 1;for (int j i ; j < nums.length; j) {s * nums[j];max Math.max(max, s);}}ret…

出国旅游常用英语,柯桥成人英语培训

Where can I catch a taxi?哪里我可以叫到出租车&#xff1f; The taxi zone is right on the left corner over there.出租车站台就在左边转角处。 Are you free?您有空吗&#xff1f; Sure. Where are you going?当然。您要去哪里&#xff1f; Drive me back to Santa …