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 objectm_Camera.Attach( pTl->CreateDevice(devices[0]));m_Camera.Open();// Open the camera object//========== Parameterize the cameram_Camera.PixelFormat.SetValue(PixelFormat_BayerBG8);// Bayer BG 8 pixel format*/m_Camera.Width.SetValue( m_iwidth);// Maximized AOIm_Camera.Height.SetValue( m_iheight);m_Camera.OffsetX.SetValue( m_ioffset_x );m_Camera.OffsetY.SetValue( m_ioffset_y );// Continuous mode, software trigger usedm_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 modem_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 queueunsigned 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.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] );//}m_Camera.AcquisitionStart.Execute();// Start image acquisitionm_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-upm_Camera.AcquisitionStop.Execute();// The camera is in continuous mode, stop image acquisitionStreamGrabber.CancelGrab();// Flush the input queue, grabbing may have failedwhile ( 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 upStreamGrabber.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)上的方法,单独定义一个类,,在类中初始化相机对象,然后在使用时,通过该类去调用相机对象。但是流对象的调试还不是很顺利,正在努力中。。。

时光的消化是这样的缓慢。虽然这也仅仅是无处可说的委屈。而不是痛苦。

basler pilot系列相机 MFC opencv

相关文章:

你感兴趣的文章:

标签云: