basler pilot系列相机 MFC opencv

采用MFC+ opencv 对basler pilot系列相机,通过千兆以太网接口实现图像数据获取,运行示例程序能够正常获取数据。但是示例程序中相机对象及数据流对象的初始化和数据的获取都是在主函数中的。现在想在mfc中实现单帧图像采集,如果每次采集都去重新获取和初始化相机对象和数据流对象,时间很慢,处理结果就来不及了。尝试着把初始化部分和数据采集部分分开,放在不同的函数中,程序调试时出现莫名的错误。想不明白是为什么。不是语法错误。

相机初始化代码:

BOOL CPylonGrabView::OnInitialCamera()
{
	Pylon::PylonAutoInitTerm autoInitTerm;

	try
	{
		CTlFactory& TlFactory= CTlFactory::GetInstance(); 
	
	/*	ITransportLayer **/pTl = TlFactory.CreateTl( Camera_t::DeviceClass() );
		DeviceInfoList_t devices;
		if ( 0 == pTl->EnumerateDevices( devices ) )// Enumerate GigE cameras
		{
			MessageBox(_T("相机不存在,请确认相机是否正确连接!"));
			TRACE("==================No camera present!====================\n");
			m_bIsCameraPresent = FALSE;
			return  FALSE;
		}
		m_bIsCameraPresent = TRUE;
		//Camera_t Camera = pTl->CreateDevice(devices[0]) ;// Create a camera object
		m_Camera.Attach( pTl->CreateDevice(devices[0]));
		m_Camera.Open();// Open the camera object
		//========== Parameterize the camera		
		m_Camera.PixelFormat.SetValue(PixelFormat_BayerBG8);// Bayer BG 8 pixel format*/

		m_Camera.Width.SetValue( m_iwidth);// Maximized AOI
		m_Camera.Height.SetValue( m_iheight);
		m_Camera.OffsetX.SetValue( m_ioffset_x );
		m_Camera.OffsetY.SetValue( m_ioffset_y );

		// Continuous mode, software trigger used	
		m_Camera.TriggerSelector.SetValue(TriggerSelector_AcquisitionStart);
		m_Camera.TriggerMode.SetValue( TriggerMode_On );
		m_Camera.AcquisitionMode.SetValue( AcquisitionMode_SingleFrame );
		m_Camera.TriggerSource.SetValue( TriggerSource_Software );

		m_Camera.ExposureMode.SetValue( ExposureMode_Timed );	// Configure exposure time and mode
		m_Camera.ExposureTimeRaw.SetValue( 200);
		// Get and open a stream grabber
		/*CBaslerGigECamera::StreamGrabber_t */StreamGrabber.Attach(m_Camera.GetStreamGrabber(0));
		StreamGrabber.Open();
		const int bufferSize = (int) m_Camera.PayloadSize();
		const int numBuffers = 10;
		StreamGrabber.MaxBufferSize = bufferSize;
		StreamGrabber.MaxNumBuffer = numBuffers;
		StreamGrabber.PrepareGrab();
		// Allocate and register image buffers, put them into the
		// grabber’s input queue
		unsigned char* ppBuffers[numBuffers];
		MyContext context[numBuffers];
		StreamBufferHandle handles[numBuffers];
		for ( int i = 0; i < numBuffers; ++i )
		{
			ppBuffers[i] = new unsigned char[bufferSize];
			handles[i] = StreamGrabber.RegisterBuffer( ppBuffers[i], bufferSize);
			StreamGrabber.QueueBuffer( handles[i], &context[i] );
		}

	}
	catch( GenICam::GenericException &e )// Error handling
	{
		TRACE("==========================An exception occurred!==================\n", e.GetDescription());
		MessageBox(e.GetDescription(),NULL,MB_OK );
		return FALSE;
	}	

}


图像采集代码:

BOOL CPylonGrabView::Grab()
{
	 StartCounter(); 
try
{
	//IStreamGrabber* pGrabber = m_Camera.GetStreamGrabber(0);
// 	CBaslerGigECamera::StreamGrabber_t StreamGrabber =
// 		m_Camera.GetStreamGrabber(0);
	/*StreamGrabber.Open();*/
	// Parameterize the stream grabber
	//const int bufferSize = (int) m_Camera.PayloadSize();
	//const int numBuffers = 10;
	//StreamGrabber.MaxBuf                                                                                                                    ferSize = bufferSize;
	//StreamGrabber.MaxNumBuffer = numBuffers;
	//StreamGrabber.PrepareGrab();
	//// Allocate and register image buffers, put them into the
	//// grabber’s input queue
	//unsigned char* ppBuffers[numBuffers];
	//MyContext context[numBuffers];
	//StreamBufferHandle handles[numBuffers];
	//for ( int i = 0; i < numBuffers; ++i )
	//{
	//	ppBuffers[i] = new unsigned char[bufferSize];
	//	handles[i] = StreamGrabber.RegisterBuffer( ppBuffers[i], bufferSize);
	//	StreamGrabber.QueueBuffer( handles[i], &context[i] );
	//}
		m_Camera.AcquisitionStart.Execute();// Start image acquisition
		m_Camera.TriggerSoftware.Execute();
	
		GrabResult Result;		
			
		if ( StreamGrabber.GetWaitObject().Wait( 3000 ))// Wait for the grabbed image with a timeout of 3 seconds
		{
			
			if ( ! StreamGrabber.RetrieveResult( Result ) )// Get an item from the grabber’s output queue
			{
				cerr << "Failed to retrieve an item from the output queue" << endl;
				return FALSE;
			}
			if ( Result.Succeeded() )
			{			
				 
				BOOL bsuccendPr = ProcessImage( (unsigned char*) Result.Buffer(), Result.GetSizeX(), Result.GetSizeY() );				
				
			}
			else
			{
				cerr << "Grab failed: " << Result.GetErrorDescription() << endl;
				return FALSE;
			}
			// Requeue the buffer
			//if ( i + numBuffers < m_numGrabs /*numGrabs*/ )
			//	StreamGrabber.QueueBuffer( Result.Handle(), Result.Context() );
		}
		else
		{
			TRACE( "==========timeout occurred when waiting for a grabbed image=========");
			return FALSE;
		}
		
		// Finished. Stop grabbing and do clean-up		
		m_Camera.AcquisitionStop.Execute();// The camera is in continuous mode, stop image acquisition	
		StreamGrabber.CancelGrab();// Flush the input queue, grabbing may have failed
		
		while ( StreamGrabber.GetWaitObject().Wait(0) )// Consume all items from the output queue
		{
			StreamGrabber.RetrieveResult( Result );
			if ( Result.Status() == Canceled )
			{
				cout << "Got canceled buffer" << endl;
			}
		}
		
		//for ( int i = 0; i < numBuffers; ++i )// Deregister and free buffers
		//{
		//StreamGrabber.DeregisterBuffer(handles[i]);
		//delete [] ppBuffers[i];
		//}
		
		StreamGrabber.FinishGrab();// Clean up
		StreamGrabber.Close();
		m_Camera.Close();
	//	TlFactory->ReleaseTl( pTl );
	}
	catch( GenICam::GenericException &e )// Error handling
	{
		TRACE("==========================An exception occurred!==================\n", e.GetDescription());
		MessageBox(e.GetDescription(),NULL,MB_OK );
		return FALSE;
	}	
	TRACE("============StopGrab==============\n");
	TRACE("==========GetCounter()==%f===============\n",GetCounter());	
	return TRUE;// Quit application
}
/////////////20120903
问题初步解决,就是按照basler的pilot系列的文档(basler_pylon_prog_guide_and_api_ref.pdf)上的方法,单独定义一个类,在类中初始化相机对象,然后在使用时,通过该类去调用相机对象。但是流对象的调试还不是很顺利,正在努力中。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章