設置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相機并不會告知上位機當前工作狀態
- 如需配置曝光等參數,須在觸發采集數據之前