Basler相机回调模式(C++)
相机
basler usb3.0,Pylon5.2
设备查询
PylonInitialize();
DeviceInfoList_t devList;
CTlFactory::GetInstance().EnumerateDevices(devList);
for( int i = 0 ; i < devList.size(); ++i)
{
std::cout<<devList.at(i).GetAddress();
}
设备连接
m_dev = CTlFactory::GetInstance().CreateDevice(devList.at(0));
m_cam = new CInstanceCamera(m_dev);
m_cam->Open();
设置
1.采图模式
enum class TriggerMode{
AUTO,
SOFT,
EXTERNAL,
};
short CameraBasler::SetTriggerMode(TriggerMode mode)
{
if(!IsOpened())
return C_ERR_Unconnected;
if(IsGrabbing())
stopGrabbing();
GenApi::InodeMap& node = m_basler->GetNodeMap();
CEnumParameter tm(node,"TriggerMode");
CEnumParameter ts(node,"TriggerSource");
bool unregistered = m_trigger == TriggerMode::SOFT;
switch(mode)
{
case TriggerMode::AUTO:
tm.SetIntValue(0);
if(!m_callback){
m_callback = new CImageEventPrinter(this);
m_cam->RegisterImageEventHandler(m_callback,RegistrationMode_Append, Cleanup_None);
}
else if(unregistered)
m_cam->RegisterImageEventHandler(m_callback,RegistrationMode_Append, Cleanup_None);
break;
case TriggerMode::SOFT:
tm.SetIntValue(1);
ts.SetIntValue(TriggerSourceEnums::TriggerSource_Software);
if(m_callback)
m_cam->DeregisterImageEventHandler(m_callback);
break;
case TriggerMode::EXTERNAL:
tm.SetIntValue(1);
if(!m_callback){
m_callback = new CImageEventPrinter(this);
m_cam->RegisterImageEventHandler(m_callback,RegistrationMode_Append, Cleanup_None);
}
else if(unregistered)
m_cam->RegisterImageEventHandler(m_callback,RegistrationMode_Append, Cleanup_None);
break;
}
return 0;
}
2.曝光
GenApi::InodeMap& node = m_basler->GetNodeMap();
CFloatParameter ep(node,"ExposureTime");
if(!pf.IsValid())
ep = CFloatParameter(node,"ExposureTimeRaw");
float value = ep.GetValue();
if( value != exposuretime)
ep.SetValue(exposuretime);
采图
short CameraBasler::startGrabbing() {
if(!IsOpened())
return C_ERR_Unconnect;
if(IsGrabbing())
return 0;
switch(m_triggerMode){
case TriggerMode::AUTO:
m_cam->StartGrabbing(GrabStrategy_LatestImageOnly);
break;
case TriggerMode::SOFT:
case TriggerMode::EXTERNAL:
m_cam->StartGrabbing(GrabStrategy_LatestImageOnly, GrabLoop_ProvidedByInstanceCamera);
break;
}
}
1.抓拍
short CameraBasler::GrabFrame(cv::Mat& mat)
{
if(!IsOpened())
return C_ERR_Unconnect;
if(GetTriggerMode() != TriggerMode::SOFT)
{
short err = SetTriggerMode(TriggerMode::SOFT);
if(err != 0)
return err ;
}
if(!IsGrabbing())
startGrabbing();
m_cam->ExecuteSoftwareTrigger();
mat = getOneFrame();
if(!mat.empty())
emit onGrabImage(mat);
return 0;
}
cv::Mat CameraBasler::getOneFrame()
{
cv::Mat mat;
CGrabResultPtr rt;
if(m_cam->RetrieveResult(2000,rt))
if(rt->GrabSucceeded()){
EPixelType pixelType = rt->GetPixelType();
switch(pixelType)
{
case PixelType_Mono8:
mat = cv::Mat(rt->GetHeight(),rt->GetWidth(),CV_8UC1,rt->GetBuffer());
break;
case PixelType_BGR8Packed:
mat = v::Mat(rt->GetHeight(),rt->GetWidth(),CV_8UC3,rt->GetBuffer());
break;
case PixelType_RGB8Packed:
mat = v::Mat(rt->GetHeight(),rt->GetWidth(),CV_8UC3,rt->GetBuffer());
cv::cvtColor(mat,mat,cv::COLOR_RGB2BGR);
break;
default :
//
break;
}
}
if(!mat.empty())
mat = mat.clone();
return mat;
}
2.连拍
short CameraBasler::StartLive()
{
if(!IsOpened())
return C_ERR_Unconnect;
if(GetTriggerMode() != TriggerMode::AUTO)
{
short err = SetTriggerMode(TriggerMode::AUTO);
if(err != 0)
return err ;
}
if(!IsGrabbing())
startGrabbing();
return 0;
}
3.外触发
class CImageEventPrinter : public CImageEventHandler
{
public:
CImageEventPrinter(CameraBasler* cam) : CImageEventHandler(), m_cam(cam){}
virtual void OnImageSkipped(CInstanceCamera& cam,size_t skippedcount){}
virtual void OnImageGrabbed(CInstanceCamera& cam, const CGrabResultPtr& presult){
auto image = getImageData(presult);
if(!image.empty())
emit m_cam->fireFrameCallback(image);
}
}
short CameraBasler::StartExternal()
{
if(!IsOpened())
return C_ERR_Unconnect;
if(GetTriggerMode() != TriggerMode::EXTERNAL)
{
short err = SetTriggerMode(TriggerMode::EXTERNAL);
if(err != 0)
return err ;
}
if(!IsGrabbing())
startGrabbing();
return 0;
}
关闭
void CameraBasler::Close()
{
if(nullptr == m_dev)
return;
if(IsOpened()){
stopGrabbing();
m_cam->Close();
}
}
CameraBasler~CameraBasler()
{
Close();
if(m_cam){
m_cam->DetachDevice();
m_cam->DestroyDevice();
delete m_cam;
}
m_dev->Close();
delete m_dev;
if(m_callback)
delete m_callback;
PylonTerminate();
}