基于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
    

猜你喜欢

转载自blog.csdn.net/weixin_39485901/article/details/88345537