一、開發(fā)環(huán)境搭建
1、Galaxy的安裝
Galaxy_windows2023年8月版本
下載完成后對軟件進(jìn)行安裝,切記自己的安裝目錄
安裝完成后,檢查自己的相機(jī)是否是網(wǎng)口相機(jī),如果是網(wǎng)口相機(jī)則需要進(jìn)行IP配置,當(dāng)相機(jī)與計(jì)算及網(wǎng)口處于同一網(wǎng)段下才可以打開相機(jī)并控制相機(jī)。
IPConfig工具可以查找到所有網(wǎng)段的設(shè)備,通過自動配置的方式配置相機(jī)IP,此時(shí)網(wǎng)口必須為固定IP
復(fù)位設(shè)備 功效等同于給設(shè)備掉電上電一次,相機(jī)內(nèi)程序全部重新加載
重連設(shè)備 功效等同于軟件接口關(guān)閉設(shè)備,執(zhí)行此操作后,允許用戶重新打開設(shè)備
打開GalaxyViewer,軟件中可以實(shí)現(xiàn)正常采集圖像,表示SDK的系統(tǒng)環(huán)境正常。
Windows環(huán)境下當(dāng)Galaxy安裝完成后,會在安裝目錄下生成APIDll、示例程序、驅(qū)動、開發(fā)文檔等
1、C# 環(huán)境配置(VS2019)
(1)新建一個(gè)C#控制臺應(yīng)用,工程》引用》右鍵》添加引用。點(diǎn)擊瀏覽,在安裝目錄中選擇dll
(2)在安裝目錄下》GalaxySDK》APIDll》根據(jù)工程架構(gòu)不同,選擇不同的dll文件,x64選擇Win64,其他選擇Win32
(3)根據(jù)目標(biāo)框架不同,選擇.NET3.5或者.NET4.0
選擇項(xiàng)目菜單,點(diǎn)擊屬性,查看目標(biāo)框架,
小于4.0版本,則使用.NET3.5大于4.0版本,則使用.NET4.0版本
(4)選擇GxIAPINET.dll文件,點(diǎn)擊添加,點(diǎn)擊確定
(5)引用中顯示已添加GxIAPINET后,在程序中添加using GxIAPINET
至此大恒工業(yè)相機(jī)C#的開發(fā)環(huán)境已經(jīng)配置完畢
2、C++ 環(huán)境配置(VS2019)
(1)新建一個(gè)C++控制臺項(xiàng)目
(2)打開項(xiàng)目菜單,選擇工程屬性
(3)配置頭文件 選擇C/C++》常規(guī)》包含附加目錄
添加安裝目錄下GalaxySDK》Samples》C++SDK》inc文件夾
(4)配置鏈接器 選擇鏈接器》常規(guī)》包含附加目錄
查看自己的工程是x86還是x64
根據(jù)工程的不同,添加安裝目錄下GalaxySDK》Samples》C++SDK》lib》x86文件夾或者x64文件夾
(5)配置鏈接器 選擇鏈接器》輸入》附加依賴項(xiàng),輸入GxIAPICPPEx.lib
添加完鏈接庫的名稱后,再我們cpp工程中引用一下GalaxyIncludes庫,就可以對我們的庫進(jìn)行調(diào)用了
至此大恒工業(yè)相機(jī)C++的開發(fā)環(huán)境已經(jīng)配置完畢
3、python 環(huán)境配置(Pycharm)
(1)新建一個(gè)工程,將GalaxySDK》Samples》Python SDK中的gxipy文件夾拷貝到工程目錄下
(2)添加PIL庫,打開文件》Settings,選擇Project:》Python Interpreter后,點(diǎn)擊 + 號
(2)搜索pillow,選擇這個(gè)庫,點(diǎn)擊Install Package進(jìn)行安裝
(3)安裝numpy,搜索numpy選擇這個(gè)庫,點(diǎn)擊Install Package進(jìn)行安裝
同樣可以對我們的GalaxyAPI進(jìn)行調(diào)用了
至此大恒工業(yè)相機(jī)python的開發(fā)環(huán)境已經(jīng)配置完畢
二、相機(jī)二次開發(fā)流程
相機(jī)的初始化相關(guān)接口及功能
- IGXFactory接口類實(shí)現(xiàn)對全局資源的初始化
- IGXFactory接口類實(shí)現(xiàn)對所有設(shè)備的枚舉
- IGXDeviceInfo接口類實(shí)現(xiàn)接收所有枚舉出的設(shè)備信息
C++示例程序
IGXFactory::GetInstance().Init();//初始化
GxIAPICPP::gxdeviceinfo_vector deviceInfo; //定義設(shè)備列表
IGXFactory::GetInstance().UpdateDeviceList(1000, deviceInfo);//枚舉設(shè)備
size_t num = deviceInfo.size();
std::cout <<"檢測到相機(jī)" << num<<"臺\n";//顯示設(shè)備數(shù)量
C#示例程序
IGXFactory.GetInstance().Init();//初始化
List<IGXDeviceInfo> deviceInfo = new List<IGXDeviceInfo>();//創(chuàng)建一個(gè)設(shè)備列表
IGXFactory.GetInstance().UpdateDeviceList(1000, deviceInfo);//枚舉所有設(shè)備
//IGXFactory.GetInstance().UpdateAllDeviceList(1000, deviceInfo);//枚舉所有設(shè)備
int num = deviceInfo.Count;//獲取設(shè)備數(shù)量
Console.WriteLine("檢測到相機(jī)"+num+"臺");
4. IGXDeviceInfo接口類獲取設(shè)備的類型、廠商名稱、 設(shè)備展示名稱、設(shè)備SN號、 IP地址、用戶id、mac地址等信息
GX_DEVICE_CLASS_LIST deviceclass = deviceInfo[0].GetDeviceClass();//獲取設(shè)備類型USB3.0、USB2.0、Gige
string vendorname = deviceInfo[0].GetVendorName();//獲取設(shè)備廠商名稱
string displayname = deviceInfo[0].GetDisplayName();//獲取設(shè)備展示名稱
string ip = deviceInfo[0].GetIP();//獲取設(shè)備ip地址
string sn = deviceInfo[0].GetSN();//獲取設(shè)備SN號
string userid = deviceInfo[0].GetUserID();//獲取設(shè)備用戶id
string mac = deviceInfo[0].GetMAC();//獲取設(shè)備mac地址
Python示例程序
DeviceManager接口類實(shí)現(xiàn)對設(shè)備的枚舉、獲取設(shè)備數(shù)量信息以及通過關(guān)鍵字獲取設(shè)備的sn號、IP地址、Mac地址、廠商名稱、設(shè)備名稱等信息
大恒相機(jī)設(shè)備控制等功能
2. IGXFactory接口類通過sn、ip、userid、mac等方式打開設(shè)備,獲取IGXDevice設(shè)備對象
CGXDevicePointer Cam;
/通過SN打開第一臺設(shè)備
Cam = IGXFactory::GetInstance().OpenDeviceBySN(sn, GX_ACCESS_EXCLUSIVE);//通過IP打開第一臺設(shè)備
Cam = IGXFactory::GetInstance().penDeviceByIP(ip,GX_ACCESS_EXCLUSIVE);//通過UserID打開第一臺設(shè)備
Cam = IGXFactory::GetInstance().OpenDeviceByUserID(userid, GX_ACCESS_EXCLUSIVE);
Cam = IGXFactory::GetInstance().OpenDeviceByMAC(mac,GX_ACCESS_EXCLUSIVE);//通MAC地址打開第一臺設(shè)備
IGXDevice Cam = null;
//通過SN打開第一臺設(shè)備
Cam = IGXFactory.GetInstance().OpenDeviceBySN(sn, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通過IP打開第一臺設(shè)備
Cam = IGXFactory.GetInstance().OpenDeviceByIP(ip, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通過UserID打開第一臺設(shè)備
cam = IGXFactory.GetInstance().OpenDeviceByUserID(userid,GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE)//
Cam = IGXFactory.GetInstance().OpenDeviceByMAC(mac, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通MAC地址打開第一臺設(shè)備
- GX_ACCESS_CONTROL以控制的方式打開相機(jī)
- GX_ACCESS_EXCLUSIVE以獨(dú)占的方式發(fā)開相機(jī)
- GX_ACCESS_READONLY以只讀的方式打開相機(jī)
IGXDevice接口類 獲取流通到個(gè)數(shù) 獲取IGXStream流通道對象獲取IGXFeatureControl、GetRemoteFeatureControl 屬性控制器
C++
//獲取流通個(gè)數(shù)
int stream_num = Cam->GetStreamCount();
//打開第一臺設(shè)備以及設(shè)備下面第一個(gè)流
CGXStreamPointer Cam_stream = Cam->OpenStream(0);
//獲取遠(yuǎn)端設(shè)備屬性控制器
CXFeatureControlpointer Cam RemoteControl = Cam->GetRemoteFeatureControl();
//獲取本地屬性控制器
CGXFeatureControlPointer Cam_Control = Cam->GetFeatureControl();
//關(guān)閉設(shè)備
Cam->Close();
C#
//獲取流通道個(gè)數(shù)
uint stream_num = Cam.GetStreamCount();
//打開設(shè)備的流
IGXStream Cam_Stream = Cam.OpenStream();
//獲取遠(yuǎn)端設(shè)備屬性控制器
IGXFeatureControl Cam_RemoteControl = Cam.GetRemoteFeatureControl();
//獲取本地屬性控制器
IGXFeatureControl Cam_Control = Cam.GetFeatureControl();
//關(guān)閉設(shè)備
Cam.Close();
Python
DeviceManager接口類通過序號、sn、ip、userid、mac等方式打開設(shè)備,獲取Device設(shè)備對象
# 通過索引序號打開設(shè)備
cam = device_manager.open_device_by_index(1)
# 通過SN號打開設(shè)備
cam = device_manager.open_device_by_sn(sn)
#通過ip地址開設(shè)備
cam = device_manager.open_device_by_ip(_ip)
# 通過mac地址打開設(shè)備
cam = device_manager .open_device_by_mac(mac)
# 通過user id打開設(shè)備
cam = device_manager.open_device_by_user_id(user_id)
Device接口類設(shè)置觸發(fā)模式、曝光、增益、獲取流通道個(gè)數(shù)、打開流通道、獲取流通道對象、關(guān)閉設(shè)備
# set continuous acquisition
cam.TriggerMode.set(gx .GxSwitchEntry .0FF)
# set exposure
cam.ExposureTime.set(10000)
# set gain
cam.Gain.set(10.0)
stream_num = cam.get_stream_channel_num()
# start data acquisition
cam.stream_on()
cam_stream = cam.data_stream[0]
cam.close_device()
IGXStream、DataStream 接口對象注冊、注銷回調(diào)采集函數(shù)。
C++
//注冊回調(diào)采集
pCaptureEventHandler = new CSampleCaptureEventHandler();
Cam_stream->RegisterCaptureCallback(pCaptureEventHandler,NULL);
//注銷回調(diào)采集
Cam_stream->UnregisterCaptureCallback();
C#
//注冊回調(diào)采集
Cam_Stream.RegisterCaptureCallback(Cam,OnFrameCallbackFun)
//注銷回調(diào)采集
Cam_Stream.UnregisterCaptureCallback();
python
#注冊采集回調(diào)函數(shù)
cam_stream.register_capture_callback(capture_callback)
# 注銷采集回調(diào)函數(shù)
cam_stream.unregister_capture_caltback()
IGXStream、DataStream 接口對象進(jìn)行單幀采集
C++
//單采集
CImageDataPointer image = Cam_stream->GetImage(2000);//超時(shí)ms
C#
//單采集
IImageData image = Cam_Stream.GetImage(2000);//超時(shí)ms
Python
# 單幀采集
raw_image = cam_stream.get_image()
三、相機(jī)相機(jī)屬性參數(shù)配置
相機(jī)屬性的數(shù)據(jù)類型
- IIntFeature IGXFeatureControl::GetIntFeature 整型
- IFloatFeature IGXFeatureControl::GetFloatFeature 浮點(diǎn)型
- IBoolFeature IGXFeatureControl::GetBoolFeature 布爾型
- IEnumFeature IGXFeatureControl::GetEnumFeature 枚舉型
- IStringFeature IGXFeatureControl::GetStringFeature 字符串
- ICommandFeature IGXFeatureControl::GetCommandFeature 命令類型
- IRegisterFeature IGXFeatureControl::GetRegisterFeature 寄存器類型
當(dāng)不知道該屬性可以被寫入時(shí),可通過IsReadable()和IsWritable()方法進(jìn)行查詢?nèi)纾?/li>
bool bIsReadable = cam_control.IsReadable("ExposureTime");
if (bIsReadable)
cam_control.GetFloatFeature("ExposureTime").GetValue():
else
MessageBox.Show("此屬性不可讀");
bool bIsWriteable = cam_control.IsWritable("Gain");
if (bIswriteable)
cam_control.GetFloatFeature("Gain").SetValue(6);
else
MessageBox.Show("此屬性不可寫"):
對于int類型和float類的屬性,可以獲取該參數(shù)可設(shè)置的最大值、最小值、步進(jìn)值,而float類型還可以獲取參數(shù)的單位
cam_control.GetIntFeature("width").GetInc();
cam_control.GetIntFeature("width").GetMin();
cam control.GetIntFeature("width").GetMax();
cam_control.GetFloatFeature("ExposureTime").GetMin();
cam_control.GetFloatFeature("ExposureTime").GetUnit()
cam_control.GetFloatFeature("ExposureTime").GetInc();
對于枚舉類型的參數(shù),可以獲取該參數(shù)的枚舉項(xiàng)列表
List<string> m_enum = cam_control.GetEnumFeature("AutoExposure").GetEnumEntryList();
對于字符串類型的參數(shù),可以獲取該參數(shù)的最大支持寫入長度
long maxlength = cam_control.GetStringFeature("DeviceUserID").GetStringMaxLength();
四、圖像采集
單幀采集
采集前必須先調(diào)用 StartGrab 開啟流通道的采集,然后再給設(shè)備發(fā)送開采命令,否則開采命令無效
//單采集
Cam_Stream.StartGrab();
Cam_RemoteControl.GetCommandFeature("AcquisitionStart").Execute();
IImageData image = Cam_Stream.GetImage(1000);//超時(shí)ms
if (image.Getstatus() == GX_FRAME_STATUS_LIST.GX FRAME_STATUS_SUCCESS)
{
//獲取到完整幀圖像進(jìn)行圖像處理
image.Destroy();
}
回調(diào)采集
采集圖像必須先注冊回調(diào)采集函數(shù),再調(diào)用 StartGrab 開啟流通道采集、再給設(shè)備發(fā)送開采命令
//注冊回調(diào)采集
Cam_Stream.RegisterCaptureCallback(Cam, OnFrameCallbackFun):
Cam_Stream.StartGrab();
Cam_RemoteControl.GetCommandFeature("AcquisitionStart").Execute();
回調(diào)函數(shù)
public static void OnFrameCallbackFun(object obj, IFrameData objIFrameData)
{
//用戶私有參數(shù) obi,用戶在注冊回調(diào)函數(shù)的時(shí)候傳入了設(shè)備對象,在回調(diào)函數(shù)內(nèi)部可以將此
//參數(shù)還原為用戶私有參數(shù)
IGXDevice objIGXDevice = obj as IGXDevice;
if (objIFrameData.Getstatus() == GX_FRAME_STATUS_LIST.GX FRAME_STATUS_SUCCESS)
{
UInt64 nwidth = objIFrameData.Getwidth();
UInt64 nHeight = objiFrameData.GetHeight();
GX_PIXEL_FORMATENTRY emPixelFormat = objIFrameData.GetPixelFormat();
}
}
回調(diào)采集圖像的數(shù)據(jù)類型為IFrameData,單幀采集的數(shù)據(jù)類型為IImageData,兩者的區(qū)別為IImageData類多了一個(gè)**Destroy()**方法
注意事項(xiàng)
千兆網(wǎng)相機(jī)心跳包
在程序正常運(yùn)行時(shí)、相機(jī)和PC之間會有心跳檢測信號保證相機(jī)處在連線狀態(tài)。
當(dāng)程序在Debug時(shí),程序在單步調(diào)試時(shí)PC無法給發(fā)送心跳包、因此當(dāng)停留時(shí)間超過心跳檢測超時(shí)時(shí)間,則會出現(xiàn)設(shè)備掉線情況。
通常將心跳檢測時(shí)間設(shè)置的大一些解決這種情況
打開設(shè)備后,沒有執(zhí)行關(guān)閉設(shè)備程序,退出了程序,再次調(diào)用相機(jī)時(shí),會出現(xiàn)設(shè)備無法打開的情況。
使用Ipconfig中的復(fù)位設(shè)備,將設(shè)備狀態(tài)重置
HDR相機(jī)
HDR相機(jī)中參數(shù)與其他相機(jī)的參數(shù)有沖突現(xiàn)象,因此在使用HDR相機(jī)時(shí),直接參考HDR相機(jī)例程
當(dāng)HDR相機(jī)開啟HDR模式后,其他例程在相機(jī)初始話曝光等參數(shù)時(shí),會出現(xiàn)錯(cuò)誤。最好運(yùn)行HDR專用例程。
PS:哈,終于寫完了,累死,其他品牌的相機(jī)用到再說
有問題可以加QQ群:907873019文章來源:http://www.zghlxwxcb.cn/news/detail-627013.html
【大恒工業(yè)相機(jī)SDK開發(fā)C#版】相機(jī)初始化,采集第一張圖像文章來源地址http://www.zghlxwxcb.cn/news/detail-627013.html
到了這里,關(guān)于WIN大恒工業(yè)相機(jī)SDK開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!