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

     

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中打开Basler相机,首先需要确保已经安装了相机驱动程序和Basler相机的相关SDK。接下来,可以按照以下步骤进行操作: 1. 在Qt中创建一个新的项目,并在项目文件中添加Basler相机的库文件和头文件的路径。 2. 在Qt的源代码文件中包含Basler相机的头文件,例如`#include <pylon/PylonIncludes.h>`。 3. 在代码中创建一个Pylon::CInstantCamera类的实例,这将代表相机对象。例如:`Pylon::CInstantCamera camera;` 4. 使用Basler相机的函数进行相机的初始化和打开。例如: ``` camera.Attach(Pylon::CTlFactory::GetInstance().CreateFirstDevice()); camera.Open(); ``` 5. 可以通过设置不同的相机参数来对相机进行配置,如曝光时间、帧率等。例如: ``` camera.ExposureTime.SetValue(10000); camera.AcquisitionFrameRateEnable.SetValue(true); camera.AcquisitionFrameRate.SetValue(30); ``` 6. 使用Qt的图形界面库来显示相机的实时图像。可以通过绑定相机的回调函数来获取相机的每一帧图像数据。例如: ``` camera.RegisterImageEventHandler(new Pylon::CImageEventHandler(), Pylon::RegistrationMode_Append, Pylon::Cleanup_Delete); camera.StartGrabbing(Pylon::GrabStrategy_LatestImageOnly); ``` 该回调函数将在每次获取图像时被触发,可在其中处理图像数据。 7. 最后,当程序要关闭或退出时,确保释放相机资源,例如: ``` camera.StopGrabbing(); camera.Close(); ``` 这样,我们就可以在Qt中成功打开和操作Basler相机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值