知微傳感Dkam系列3D相機SDK例程篇:CSharp設置相機工作模式

設置3D相機觸發模式

寫在前面

  • 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有:
    • 1、便利他人應用3D相機,本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋;
    • 2、促進行業發展及交流。

設置觸發模式及API說明

觸發模式說明
  • 知微傳感Dkam系列3D相機擁有連續模式和觸發模式兩種工作模式
  • 連續模式是3D相機主動采集數據并不斷上傳輸出
  • 觸發模式是3D相機在收到觸發信號后才會采集數據并更新輸出
  • 知微傳感Dkam系列3D相機具備軟觸發功能
  • 知微傳感Dkam系列3D相機除D2xx和D300外均具備硬觸發功能
  • 軟觸發即發送數據采集命令后采集一次數據,硬觸發即有外部電觸發信號后采集一次數據
  • 硬觸發的電氣連線方式、電氣要求和電氣邏輯請參考3D相機說明書
設置流程
掃描局域網內的相機
連接相機
配置相機工作模式為觸發模式
設置觸發源
觸發相機
等待相機上傳數據
結束
API
  • SetTriggerMode 設置點云和紅外的工作模式
    • int SetTriggerMode(Camera_Object_C* camera_obj,int mode)
    • 函數功能: 設置點云、紅外觸發模式
    • 參 數: camera_obj:相機的結構體指針
    • 參數:mode:模式選擇(0 連續 1 觸發)
    • 返回值: 0:設置成功 非 0:設置失敗
  • SetRGBTriggerMode 設置RGB的工作模式
    • int SetRGBTriggerMode(Camera_Object_C* camera_obj,int mode)
    • 函數功能: 設置 RGB 觸發模式
    • 參 數: camera_obj:相機的結構體指針
    • 參 數: mode:模式選擇(0 連續 1 觸發)
    • 返回值: 0:設置成功 非 0:設置失敗
  • SetTriggerSource 觸發源
    • int SetTriggerSource(Camera_Object_C* camera_obj, int sourcetype)
    • 函數功能:設置相機軟/硬觸發
    • 參數:camera_obj:相機的結構體指針
    • 參數: sourcetype:相機觸發類型(0:軟觸發 1:硬觸發)
    • 返回值:0:設置成功 小于 0:設置失敗
    • 注:該API同時設置紅外、點云和RGB的觸發源
  • SetTriggerCount 觸發紅外和點云
    • int SetTriggerCount()
    • 函數功能: 觸發相機采集點云和紅外數據
    • 參 數: 無
    • 返回值: 0:設置成功 非 0:設置失敗
  • SetRGBTriggerCount 觸發RGB
    • int SetRGBTriggerCount()
    • 函數功能: 觸發相機采集RGB數據
    • 參 數: 無
    • 返回值: 0:設置成功 非 0:設置失敗

例程及注釋

  • 本例程基于WIN10+VisualStudio2022+DkamSDK_1.6.83驗證
  • DkamSDK的配置方法請參考SDK說明書
  • 本例程在D33XS型相機上驗證
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TriggerMode_CSharp
{internal class Program{static void Main(string[] args){Console.WriteLine("Hello ZhiSENSOR!");//**********************************************查詢、連接相機****************************************************int camer_num = 0;int camera_ret = -1;//想要連接的相機IPString tarCameraIP = "192.168.40.91";//發現局域網內的相機camer_num = DkamSDK_CSharp.DiscoverCamera();Console.WriteLine("局域網內共有" + camer_num + "臺3D相機");//顯示局域網內相機IPfor (int i = 0; i < camer_num; i++){Console.WriteLine("局域網內相機的IP為:" + DkamSDK_CSharp.CameraIP(i));if (String.Compare(DkamSDK_CSharp.CameraIP(i), tarCameraIP) == 0){camera_ret = i;}}Console.WriteLine("連接IP為:" + tarCameraIP + "的相機");//連接相機SWIGTYPE_p_CAMERA_OBJECT camera = DkamSDK_CSharp.CreateCamera(camera_ret);int connect = DkamSDK_CSharp.CameraConnect(camera);//**********************************************查詢、連接相機****************************************************if (connect == 0){Console.WriteLine("相機連接成功!");//獲取當前紅外相機的寬和高SWIGTYPE_p_int width_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraWidth(camera, width_gray, 0);int width = DkamSDK_CSharp.intArray_getitem(width_gray, 0);SWIGTYPE_p_int height_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraHeight(camera, height_gray, 0);int height = DkamSDK_CSharp.intArray_getitem(height_gray, 0);Console.WriteLine("紅外圖寬度:" + width + "    紅外圖高度:" + height);//獲取當前RGB相機的寬和高SWIGTYPE_p_int width_rgb = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraWidth(camera, width_rgb, 1);int widthRGB = DkamSDK_CSharp.intArray_getitem(width_rgb, 0);SWIGTYPE_p_int height_rgb = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraHeight(camera, height_rgb, 1);int heightRGB = DkamSDK_CSharp.intArray_getitem(height_rgb, 0);Console.WriteLine("RGB 圖寬度:" + widthRGB + "    RGB 圖高度:" + heightRGB);//定義接收紅外數據的內存大小PhotoInfoCSharp gray_data = new PhotoInfoCSharp();int graysize = width * height;byte[] gray_pixel = new byte[graysize];//定義接收點云數據的內存大小PhotoInfoCSharp PointCloud_data = new PhotoInfoCSharp();int pointsize = width * height * 6;byte[] point_pixel = new byte[pointsize];//定義接收RGB數據的內存大小PhotoInfoCSharp RGB_data = new PhotoInfoCSharp();int RGBsize = widthRGB * heightRGB * 3;byte[] RGB_pixel = new byte[RGBsize];//**********************************************設置工作模式****************************************************//設置相機紅外和點云工作模式,也即點云獲取的工作模式: 0 連拍模式  1 觸發模式//設置紅外/點云觸發模式int grayMode = 1;if (grayMode == 1){Console.WriteLine( "設置點云和紅外圖/點云的工作模式為觸發模式。。。" );}else{Console.WriteLine("設置點云和紅外圖/點云的工作模式為連拍模式。。。");}int triggerMode = DkamSDK_CSharp.SetTriggerMode(camera, grayMode);if (triggerMode == 0){Console.WriteLine("設置點云和紅外圖為觸發模式成功!" );}else{Console.WriteLine("設置點云和紅外圖為觸發模式失敗!!!");}//設置相機RGB工作模式: 0 連拍模式  1 觸發模式int RGBMode = 1;if (RGBMode == 1){Console.WriteLine("設置RGB圖的工作模式為觸發模式。。。" );}else{Console.WriteLine("設置RGB圖的工作模式為連拍模式。。。" );}int tirggerModergb = DkamSDK_CSharp.SetRGBTriggerMode(camera, RGBMode);if (tirggerModergb == 0){Console.WriteLine("設置RGB圖為觸發模式成功!" );}else{Console.WriteLine("設置RGB圖為觸發模式失敗!!!" );}//設置觸發源,該函數同時設置點云、紅外和RGB:0 軟觸發,1 硬觸發int TrigSour = 0;if (TrigSour == 0){Console.WriteLine("設置觸發源為軟觸發。。。");}else{Console.WriteLine("設置觸發源為硬觸發。。。" );}int tirggersource = DkamSDK_CSharp.SetTriggerSource(camera,TrigSour);if (tirggersource == 0){Console.WriteLine("設置觸發源成功!" );}else{Console.WriteLine("設置觸發源失敗!!!");}//**********************************************打開數據通道****************************************************//開啟數據流通道(0:紅外 1:點云 2:RGB)//紅外int streamgray = DkamSDK_CSharp.StreamOn(camera, 0);if (streamgray == 0){Console.WriteLine("紅外圖通道打開成功!");}else{Console.WriteLine("紅外圖通道打開失敗!!!     錯誤碼:" + streamgray);}//點云int streampoint = DkamSDK_CSharp.StreamOn(camera, 1);if (streampoint == 0){Console.WriteLine("點云通道打開成功!");}else{Console.WriteLine("點云通道打開失敗!!!     錯誤碼:" + streampoint);}int streamRGB = DkamSDK_CSharp.StreamOn(camera, 2);if (streamRGB == 0){Console.WriteLine("RGB 圖通道打開成功!");}else{Console.WriteLine("RGB 圖通道打開失敗!!!     錯誤碼:" + streamRGB);}//開始接受數據int start = DkamSDK_CSharp.AcquisitionStart(camera);if (start == 0){Console.WriteLine("可以開始接收數據!");}else{Console.WriteLine("不能接收數據!!!     錯誤碼:" + start);}//刷新緩沖區DkamSDK_CSharp.FlushBuffer(camera, 0);  //紅外DkamSDK_CSharp.FlushBuffer(camera, 1);  //點云DkamSDK_CSharp.FlushBuffer(camera, 2);  //RGB//**********************************************觸發相機:軟觸發***************************************//觸發采集點云和紅外int triggerCount = DkamSDK_CSharp.SetTriggerCount(camera);if (triggerCount == 0){Console.WriteLine("點云和紅外采集觸發成功!" );}else{Console.WriteLine("點云和紅外采集觸發失敗!!!" );}//觸發采集RGBint triggerCountRGB = DkamSDK_CSharp.SetRGBTriggerCount(camera);if (triggerCountRGB == 0){Console.WriteLine("RGB采集觸發成功!" );}else{Console.WriteLine("RGB采集觸發失敗!!!");}Console.WriteLine("等待數據采集、傳輸。。。");//**********************************************等待相機上傳數據***************************************//獲取紅外數據int capturegray = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 0, gray_data, gray_pixel, graysize,10000000);if (capturegray == 0){Console.WriteLine("紅外數據接收成功!");}else{Console.WriteLine("紅外數據接收失敗!!!     錯誤碼:" + capturegray);}//獲取點云數據int capturepoint = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 1, PointCloud_data, point_pixel, pointsize, 10000000);if (capturepoint == 0){Console.WriteLine("點云數據接收成功!");}else{Console.WriteLine("點云數據接收失敗!!!     錯誤碼:" + capturepoint);}//獲取RGB數據int capturergb = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 2, RGB_data, RGB_pixel, RGBsize,10000000);if (capturergb == 0){Console.WriteLine("RGB數據接收成功!");}else{Console.WriteLine("RGB數據接收失敗!!!     錯誤碼:" + capturergb);}//保存紅外數據int savegray = DkamSDK_CSharp.SaveToBMPCSharp(camera, gray_data, gray_pixel, graysize, "gray.bmp");if (savegray == 0){Console.WriteLine("紅外數據保存成功!");}else{Console.WriteLine("紅外數據保存失敗敗!!!     錯誤碼:" + savegray);}//保存點云數據int savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud.pcd");if (savepoint == 0){Console.WriteLine("點云數據保存成功!");}else{Console.WriteLine("點云數據保存失敗!!!     錯誤碼:" + savepoint);}//保存RGB數據int saveRGB = DkamSDK_CSharp.SaveToBMPCSharp(camera, RGB_data, RGB_pixel, RGBsize, "rgb.bmp");if (saveRGB == 0){Console.WriteLine("RGB數據保存成功!");}else{Console.WriteLine("RGB數據保存失敗!!!     錯誤碼:" + saveRGB);}//**********************************************結束工作***************************************//釋放內存Array.Clear(point_pixel, 0, point_pixel.Length);Array.Clear(gray_pixel, 0, gray_pixel.Length);Array.Clear(RGB_pixel, 0, RGB_pixel.Length);//關閉數據流DkamSDK_CSharp.AcquisitionStop(camera);int streamoff = DkamSDK_CSharp.StreamOff(camera, 0);int streamoffpoint = DkamSDK_CSharp.StreamOff(camera, 1);int streamoffRGB = DkamSDK_CSharp.StreamOff(camera, 2);//斷開相機連接int disconnect = DkamSDK_CSharp.CameraDisconnect(camera);if (disconnect == 0){Console.WriteLine("成功斷開相機!");}else{Console.WriteLine("斷開相機失敗!!!     錯誤碼:" + disconnect);}//銷毀相機參數DkamSDK_CSharp.DestroyCamera(camera);}//connect = 0else{Console.WriteLine("相機連接失敗,失敗代碼:" + connect);}}//main}//program
}//namespace

輸出

在這里插入圖片描述

后記

  • 觸發模式下3D相機為主動工作,觸發后上位機等待相機拍攝完成并上傳,期間3D相機并不會告知上位機當前工作狀態
  • 如需配置曝光等參數,須在觸發采集數據之前

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP 常用函數及用法

文章目錄PHP 常用函數及用法一、字符串處理函數1. 字符串基礎操作2. 字符串查找與替換3. 字符串分割與連接4. 字符串大小寫轉換5. 字符串格式化二、數組操作函數1. 數組基礎操作2. 數組遍歷與查找3. 數組修改與排序4. 數組過濾與合并三、文件操作函數1. 文件讀寫2. 文件和目錄信…

yum命令--obsoletes與--allowerasing兩者的區別

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是兩個與包升級 / 安裝相關的選項&#xff0c;它們的功能和使用場景有明顯區別&#xff1a; 1. --obsoletes&#xff08;默認啟用&#xff09;作用&#xff1…

Day24_【深度學習(3)—PyTorch使用(1)—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

阿里云圖像編輯大模型開發部署

與阿里云一起輕松實現數智化讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;用數據的實時在線&#xff0c;幫助客戶以數據為中心改變生產生活方式創造新的價值。圖像…

查看磁盤分區并新建一個分區,掛載分區

linux系統磁盤df -h查看文件系統的磁盤的空間占用情況&#xff0c;常用于快速檢查磁盤使用率&#xff1a;df -h-h是說把磁盤空間以G位單位&#xff0c;如果直接用df也是可以的&#xff0c;只不過單位是塊&#xff0c;看的不明顯du -sh /home/查看/home目錄下總共占用了多大的空…

vscode單擊暫時預覽文件 雙擊持續打開文件

直接單擊文件列表中的文件&#xff0c;會在編輯器中以預覽模式打開 文件標簽會顯示為斜體&#xff0c;表示是預覽狀態 當您單擊另一個文件或開始編輯時&#xff0c;預覽文件會自動關閉 在 settings.json 中添加&#xff0c;mac通過cmd,實現。 json {"workbench.editor.ena…

設計模式-橋接模式04

什么是橋接模式&#xff1f; 橋接模式就是把事物的兩個方面&#xff08;兩個變化的維度&#xff09;分開管理&#xff0c;讓它們可以分別自由變化&#xff0c;然后通過一個“橋”把它們連接起來。舉個生活中的例子 想象一下你在買鞋子&#xff1a; 鞋子有不同的款式&#xff08…

群暉企業級NAS :從中小企業效率工具到核心業務數據基石

在數字化轉型加速的今天&#xff0c;數據已成為企業最核心的資產。全球超半數財富 500 強企業選擇群暉&#xff08;Synology&#xff09;作為數據管理伙伴&#xff0c;其企業級 NAS 解決方案憑借 DSM 操作系統的生態優勢、硬件與軟件的深度協同&#xff0c;以及覆蓋全場景的產品…

C++訪問限定符private、public、protected的使用場景

C 訪問控制關鍵字&#xff1a;public、private、protected 在C中&#xff0c;public、private和protected是訪問控制關鍵字&#xff0c;用于實現面向對象編程的封裝特性&#xff0c;控制類成員的訪問權限。 訪問控制關鍵字的使用場景 1. public&#xff08;公有成員&#xff09…

CKA08--PVC

Task mariadb namespace 中的 MariaDB Deployment 被誤刪除。請恢復該 Deployment 并確保數據持久性。 請按照以下步驟&#xff1a; 如下規格在 mariadb namespace 中創建名為 mariadb 的 PersistentVolumeClaim (PVC)&#xff1a; 訪問模式為 ReadWriteOnce 存儲為 250Mi 集群…

Freertos系列(調度機制與創建任務)

如果不想看的可以直接使用git把我的代碼下載出來&#xff0c;里面工程挺全的&#xff0c;后期會慢慢的補注釋之類的 碼云地址&#xff1a;stm32學習筆記: stm32學習筆記源碼 如果不會使用git快速下載可以選擇直接下載壓縮包或者去看看git的使用 Git入門教程-CSDN博客 一 調…

C++中std::vector Vs std::deque VS std::list對比詳解

1) 核心差異速覽 std::vector&#xff1a;連續內存、隨機訪問 O(1)、尾部 push_back 攤還 O(1)、中間插入/刪除 O(n)&#xff0c;非常緩存友好。std::deque&#xff1a;分段&#xff08;block&#xff09;存儲&#xff0c;不是整體連續&#xff1b;隨機訪問 O(1)&#xff08;但…

【js】js實現日期轉大寫:

文章目錄一、方法&#xff1a;二、使用效果&#xff1a;一、方法&#xff1a; export function dateToChnese(strDate) {let dateMap {year: "",month: "",day: ""}if (!strDate || strDate.length 0) return dateMap;const chineseDigit [&…

逆向 js

參考地址&#xff1a;https://blog.csdn.net/2302_80243887/article/details/146349209 注意事項 1. crypto-js 安裝 需要你的.js文件同級目錄執行npm install crypto-js 才能讓js文件引入包 注意事項2&#xff1a; crypto-js 執行js 報錯_external_runtime.py" A…

FFmpeg的安裝及簡單使用

簡介 FFmpeg 是一個跨平臺的音視頻處理工具庫/命令行工具&#xff0c;其核心作用是&#xff1a;對音視頻文件或流進行解碼、轉換&#xff08;編碼&#xff09;、封裝/解封裝等處理。 友情提示 本次安裝以Windows64位操作系統為例 一、下載及安裝 1、前往FFmpeg官網&#xff0…

Science Advances--3D打印生物啟發扭曲雙曲超材料,用于無人機沖擊緩沖和自供電實時傳感

湍流引起的振動會對飛機的結構完整性及飛行穩定性造成巨大威脅&#xff0c;尤其是在無人駕駛飛行器&#xff08;UAV&#xff09;中&#xff0c;實時的沖擊監測和輕質防護尤為重要。該研究基于生物啟發&#xff0c;通過3D 打印尼龍PA12 制備了一種扭轉-雙曲面超材料&#xff08;…

AI大模型的研發流程

開發一個大模型是一個龐大、復雜且資源密集的系統工程&#xff0c;涉及算法研究、工程實現、數據管理和算力基礎設施等多個層面。下面我將為您提供一個從零開始開發大模型的全景式路線圖&#xff0c;涵蓋了從概念到部署的全過程。請注意&#xff0c;完全從零開始訓練一個類似GP…

Docker desktop安裝Redis Cluster集群

本文章將介紹如何在 Windows 系統的 Docker Desktop 環境中搭建 Redis 集群。將創建一個包含 6 個節點&#xff08;3 主 3 從&#xff09;的 Redis 集群。 環境準備 Windows 10/11 操作系統Docker Desktop 已安裝并運行 步驟 清理環境&#xff08;如之前有嘗試&#xff09; 如果…

Zynq開發實踐(SDK之第一個純PS工程)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】學編程的時候&#xff0c;大家一般都比較重視第一個項目的創建和執行。第一個fpga程序一般是led閃爍&#xff0c;第一個c程序一般就是hello world程…

EJS(Embedded JavaScript)(一個基于JavaScript的模板引擎,用于在HTML中嵌入動態內容)

文章目錄**1. 什么是 EJS&#xff1f;****2. 核心特點**- **接近原生 HTML**- **動態渲染**- **輕量高效**- **與 Express 深度集成****3. EJS 的基本語法****4. 示例代碼****HTML 模板&#xff08;views/user.ejs&#xff09;****Express 中渲染模板****5. 使用場景**1. **服務…