Basler相机回调模式(C++)

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();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值