深視 線掃相機 獲取點云數據

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.pswp.cn/web/13022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13022.shtml
英文地址,請注明出處:http://en.pswp.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 …