天天看點

基于Qt的Basler相機開發記錄

最近鼓搗了将近兩個禮拜的basler相機,現在做一個二次開發的記錄,友善後面的使用和學習

  • 一般的工業相機的開發從打開相機到采集圖檔再到關閉相機的步驟流程如下:
  1. 枚舉裝置
  2. 建立句柄
  3. 打開裝置
  4. 開始抓圖
  5. 擷取圖像
  6. 停止抓圖
  7. 關閉裝置
  8. 銷毀句柄
  • 其次就是對相機的API的使用,basler相機的API函數還是蠻好用的,簡單明了,在調用API開發之前還是先看一下官方的開發手冊為好,相機開發通常有軟體觸發和硬體觸發兩種方式,這裡采用的是硬體觸發,basler相機的接口提供觸發信号輸入,其中2口是信号脈沖輸入端,5口是接地端口,這樣采用FPGA産生一個不斷循環的脈沖就能觸發相機進行采集圖像了。
  • 硬體觸發這塊OK了,軟體這裡還要進行設定,說明相機是硬體觸發方式C++代碼如下,在官方手冊ace Camera Link Users Manual中7.3.3 Using a Hardware Frame Start Trigger Signal中有詳細介紹:
/*設定相機是外部觸發*/
INodeMap &NodeMap = m_camera.GetNodeMap();
//CEnumerationPtr pNode_TriggerSelectorAcquisition =         
 NodeMap.GetNode("TriggerSelector");
//pNode_TriggerSelectorAcquisition->SetIntValue();
CEnumerationPtr pNode_TriggerSelector = NodeMap.GetNode("TriggerSelector");
pNode_TriggerSelector->SetIntValue(TriggerSelector_FrameStart);
// Disable the acquisition frame rate parameter (this will disable the camera’s
// internal frame rate control and allow you to control the frame rate with
// external frame start signals)
CBooleanPtr pNode_AcquisitionFrameRateEnable = 
NodeMap.GetNode("AcquisitionFrameRateEnable");
pNode_AcquisitionFrameRateEnable->SetValue(false);
CEnumerationPtr pNode_TriggerSource = 
NodeMap.GetNode("TriggerSource");//TriggerMode//TriggerSource
pNode_TriggerSource->SetIntValue(TriggerSource_Line1);
CEnumerationPtr pNode_TriggerMode = 
NodeMap.GetNode("TriggerMode");//TriggerMode//TriggerSource
pNode_TriggerMode->SetIntValue(TriggerMode_On);
CEnumerationPtr pNode_LineMode = NodeMap.GetNode("LineMode");
pNode_LineMode->SetIntValue(LineMode_Input);
CEnumerationPtr pNode_LineSelector = NodeMap.GetNode("LineSelector");
pNode_LineSelector->SetIntValue(LineSelector_Line1);
CEnumerationPtr pNode_TriggerActivation = NodeMap.GetNode("TriggerActivation");
pNode_TriggerActivation->SetIntValue(TriggerActivation_RisingEdge);
double TriggerDelay_ms = 0.1;
CFloatPtr pNode_TriggerDelayAbs = NodeMap.GetNode("TriggerDelay");
pNode_TriggerDelayAbs->SetValue(TriggerDelay_ms);
CEnumerationPtr pNode_ExposureMode = NodeMap.GetNode("ExposureMode");
pNode_ExposureMode->SetIntValue(ExposureMode_TriggerWidth);;
CFloatPtr pNode_TriggerDelay = NodeMap.GetNode("TriggerDelay");
double ExposureTime = 0;
pNode_TriggerDelay->SetValue(0);
           
  •  還有一個需要注意的是,相機的幀率問題,相機的幀率不光由FPGA的觸發信号決定,還需要根據調節曝光時間來最終确定相機的真實幀率,API中沒有提供幀率的函數,是以隻能用官方自帶的軟體調節曝光時間,并且軟體能直接看到幀率的變化,是以先調好後友善自己使用,這裡還需要再研究一下,仔細看一下官方的文檔,畢竟這樣還是較麻煩。
  • Verilog代碼如下:
    module BaslerTrigger
    (	CLK_50M,
    	RST_N,
    	TriggerSignal
    );
    /*外部端口說明*/
    input CLK_50M;
    input RST_N;
    output TriggerSignal;
    
    reg [16:0] time_cnt1;
    reg [16:0] time_cnt1_n;
    
    reg        TriggerSignal;
    reg        TriggerSignal_n;
    
    always@(posedge CLK_50M or negedge RST_N)
    begin
    	if(!RST_N)
    		time_cnt1<=1'b0;
    	else
    		time_cnt1<=time_cnt1_n;
    end
    
    always@(*)
    begin
    	if(time_cnt1==17'd49999)//時鐘是20ns,time_cnt1周期是2ms
    		time_cnt1_n=1'b0;
    	else
    		time_cnt1_n=time_cnt1+1'b1;
    end
    
    always@(posedge CLK_50M or negedge RST_N)
    begin
    	if(!RST_N)
    		TriggerSignal<=1'b0;
    	else
    		TriggerSignal<=TriggerSignal_n;
    end
    
    always@(*)
    begin
    	if(time_cnt1==17'd49999)//TriggerSignal信号周期也是2ms變化一次電平,是以相機的觸發周期是2ms
    		TriggerSignal_n=~TriggerSignal;
    	else
    		TriggerSignal_n=TriggerSignal;
    end
    
    endmodule
               
Qt

繼續閱讀