void MLTCam::CreateStreamBuffers( PvDevice *aDevice, PvStream *aStream, BufferList *aBufferList ) { // Reading payload size from device uint32_t lSize = aDevice->GetPayloadSize(); // Use BUFFER_COUNT or the maximum number of buffers, whichever is smaller uint32_t lBufferCount = ( aStream->GetQueuedBufferMaximum() < BUFFER_COUNT ) ? aStream->GetQueuedBufferMaximum() : BUFFER_COUNT; // Allocate buffers for ( uint32_t i = 0; i < lBufferCount; i++ ) { // Create new buffer object PvBuffer *lBuffer = new PvBuffer; // Have the new buffer object allocate payload memory lBuffer->Alloc( static_cast<uint32_t>( lSize ) ); // Add to external list - used to eventually release the buffers aBufferList->push_back( lBuffer ); } // Queue all buffers in the stream BufferList::iterator lIt = aBufferList->begin(); while ( lIt != aBufferList->end() ) { aStream->QueueBuffer( *lIt ); lIt++; } }
void PleoraVideo::InitBuffers(size_t buffer_count) { // Reading payload size from device const uint32_t lSize = lDevice->GetPayloadSize(); // Use buffer_count or the maximum number of buffers, whichever is smaller const uint32_t lBufferCount = ( lStream->GetQueuedBufferMaximum() < buffer_count ) ? lStream->GetQueuedBufferMaximum() : buffer_count; // Allocate buffers and queue for( uint32_t i = 0; i < lBufferCount; i++ ) { PvBuffer *lBuffer = new PvBuffer; lBuffer->Alloc( static_cast<uint32_t>( lSize ) ); lBufferList.push_back( lBuffer ); } }
bool AcquireImages() { PvResult lResult; PvDeviceInfo *lDeviceInfo = NULL; PvSystem lSystem; PvStream lStream; lSystem.SetDetectionTimeout( 20000 ); lResult = lSystem.Find(); if( !lResult.IsOK() ) { cout << "PvSystem::Find Error: " << lResult.GetCodeString().GetAscii(); return -1; } PvUInt32 lInterfaceCount = lSystem.GetInterfaceCount(); for( PvUInt32 x = 0; x < lInterfaceCount; x++ ) { PvInterface * lInterface = lSystem.GetInterface( x ); cout << "Ethernet Interface " << endl; cout << "IP Address: " << lInterface->GetIPAddress().GetAscii() << endl; cout << "Subnet Mask: " << lInterface->GetSubnetMask().GetAscii() << endl << endl; PvUInt32 lDeviceCount = lInterface->GetDeviceCount(); for( PvUInt32 y = 0; y < lDeviceCount ; y++ ) { lDeviceInfo = lInterface->GetDeviceInfo( y ); cout << "ThermoCam " << endl; cout << "IP Address: " << lDeviceInfo->GetIPAddress().GetAscii() << endl; } } if( lDeviceInfo != NULL ) { cout << "Connecting to " << lDeviceInfo->GetIPAddress().GetAscii() << endl; PvDevice lDevice; lResult = lDevice.Connect( lDeviceInfo ); if ( !lResult.IsOK() ) { cout << "Unable to connect to " << lDeviceInfo->GetIPAddress().GetAscii() << endl; } else { cout << "Successfully connected to " << lDeviceInfo->GetIPAddress().GetAscii() << endl; lResult = lDevice.NegotiatePacketSize( ); if ( !lResult.IsOK() ) { cout << endl; cout << " Failed to negotiate a packet size setting GevSCPSPacketSize to original value"; PvSleepMs( 2500 ); } cout << endl; cout << "3. Open stream......"; lResult = lStream.Open( lDeviceInfo->GetIPAddress() ); if ( !lResult.IsOK() ) { cout << endl; cout << " Failed to open stream"; return 0; } lDevice.SetStreamDestination( lStream.GetLocalIPAddress(), lStream.GetLocalPort() ); PvInt64 lPayloadSize; lDevice.GetGenParameters()->GetIntegerValue( "PayloadSize", lPayloadSize ); PvBuffer * lBuffer = new PvBuffer(); lBuffer->Alloc( static_cast<PvUInt32>( lPayloadSize ) ); PvBuffer *lPtr = NULL; PvImage *lImage = NULL; cout << endl; cout << "5. Grab one image" << endl; lStream.QueueBuffer( lBuffer ); lDevice.GetGenParameters()->SetIntegerValue( "TLParamsLocked", 1 ); lDevice.GetGenParameters()->ExecuteCommand( "AcquisitionStart" ); PvResult lStreamResult; lResult = lStream.RetrieveBuffer( &lPtr, &lStreamResult, 10000 ); lDevice.GetGenParameters()->ExecuteCommand( "AcquisitionStop" ); lDevice.GetGenParameters()->SetIntegerValue( "TLParamsLocked", 0 ); PvInt64 lWidth = 0, lHeight = 0; PvGenParameterArray *lDeviceParams = lDevice.GetGenParameters(); lDeviceParams->GetIntegerValue( "Width", lWidth); lDeviceParams->GetIntegerValue( "Height", lHeight); cvNamedWindow("OpenCV: ThermoCam",CV_WINDOW_NORMAL); cv::Mat raw_lImage(cv::Size(lWidth,lHeight),CV_8U); if ( lResult.IsOK() ) { if ( lStreamResult.IsOK() ) { cout << endl; cout << "6. Using RGB Filter"; lImage=lPtr->GetImage(); lPtr->GetImage()->Alloc(lImage->GetWidth(),lImage->GetHeight(),PvPixelMono8); cout << " a. Save the original image into ImageOriginal.bmp"; PvBufferWriter lBufferWriter; lBufferWriter.Store(lPtr,"ThermoCam.bmp",PvBufferFormatBMP); } lImage->Attach(raw_lImage.data,lImage->GetWidth(),lImage->GetHeight(),PvPixelMono8); //cv::imshow("OpenCV: ThermoCam",raw_lImage); cv::FileStorage fs("ThermoCam.xml",cv::FileStorage::WRITE); fs << "raw_lImage" << raw_lImage; fs.release(); //if(cv::waitKey(1000) >= 0) break; lPtr->Free(); } lBuffer->Free(); lDevice.ResetStreamDestination(); lStream.Close(); lDevice.Disconnect(); return true; } } else { cout << "No device found" << endl; } return 0; }
PleoraVideo::PleoraVideo(const char* model_name, const char* serial_num, size_t index, size_t bpp, size_t binX, size_t binY, size_t buffer_count, size_t desired_size_x, size_t desired_size_y, size_t desired_pos_x, size_t desired_pos_y) : lPvSystem(0), lDevice(0), lStream(0) { lPvSystem = new PvSystem(); if ( !lPvSystem ) { throw pangolin::VideoException("Pleora: Unable to create PvSystem"); } const PvDeviceInfo *lDeviceInfo = SelectDevice(*lPvSystem, model_name, serial_num, index); if ( !lDeviceInfo ) { throw pangolin::VideoException("Pleora: Unable to select device"); } PvResult lResult; lDevice = PvDevice::CreateAndConnect( lDeviceInfo, &lResult ); if ( !lDevice ) { throw pangolin::VideoException("Pleora: Unable to connect to device", lResult.GetDescription().GetAscii() ); } lStream = PvStream::CreateAndOpen( lDeviceInfo->GetConnectionID(), &lResult ); if ( !lStream ) { lDevice->Disconnect(); PvDevice::Free(lDevice); throw pangolin::VideoException("Pleora: Unable to open stream", lResult.GetDescription().GetAscii() ); } lDeviceParams = lDevice->GetParameters(); lStart = dynamic_cast<PvGenCommand*>( lDeviceParams->Get( "AcquisitionStart" ) ); lStop = dynamic_cast<PvGenCommand*>( lDeviceParams->Get( "AcquisitionStop" ) ); if( bpp == 8) { lDeviceParams->SetEnumValue("PixelFormat", PvString("Mono8") ); }else if(bpp == 10) { lDeviceParams->SetEnumValue("PixelFormat", PvString("Mono10p") ); }else if(bpp == 12) { lDeviceParams->SetEnumValue("PixelFormat", PvString("Mono12p") ); } // Height and width will fail if not multiples of 8. lDeviceParams->SetIntegerValue("Height", desired_size_y ); if(lResult.IsFailure()){ pango_print_error("Height %zu fail\n", desired_size_y); int64_t max, min; lDeviceParams->GetIntegerRange("Height", max, min ); lDeviceParams->SetIntegerValue("Height", max ); } lDeviceParams->SetIntegerValue("Width", desired_size_x ); if(lResult.IsFailure()){ pango_print_error("Width %zu fail\n", desired_size_x); int64_t max, min; lDeviceParams->GetIntegerRange("Width", max, min ); lDeviceParams->SetIntegerValue("Width", max ); } lDeviceParams = lDevice->GetParameters(); const int w = DeviceParam<int64_t>("Width"); const int h = DeviceParam<int64_t>("Height"); // Offset will fail if not multiple of 8. lDeviceParams->SetIntegerValue("OffsetX", desired_pos_x ); if(lResult.IsFailure()){ pango_print_error("OffsetX %zu fail\n", desired_pos_x); } lDeviceParams->SetIntegerValue("OffsetX", desired_pos_y ); if(lResult.IsFailure()){ pango_print_error("OffsetY %zu fail\n", desired_pos_y); } lResult =lDeviceParams->SetIntegerValue("BinningHorizontal", binX ); if(lResult.IsFailure()){ pango_print_error("BinningHorizontal %zu fail\n", binX); } lResult =lDeviceParams->SetIntegerValue("BinningVertical", binY ); if(lResult.IsFailure()){ pango_print_error("BinningVertical %zu fail\n", binY); } lStreamParams = lStream->GetParameters(); // Reading payload size from device const uint32_t lSize = lDevice->GetPayloadSize(); // Use buffer_count or the maximum number of buffers, whichever is smaller const uint32_t lBufferCount = ( lStream->GetQueuedBufferMaximum() < buffer_count ) ? lStream->GetQueuedBufferMaximum() : buffer_count; // Allocate buffers and queue for ( uint32_t i = 0; i < lBufferCount; i++ ) { PvBuffer *lBuffer = new PvBuffer; lBuffer->Alloc( static_cast<uint32_t>( lSize ) ); lBufferList.push_back( lBuffer ); } // Setup pangolin for stream PvGenEnum* lpixfmt = dynamic_cast<PvGenEnum*>( lDeviceParams->Get("PixelFormat") ); const VideoPixelFormat fmt = PleoraFormat(lpixfmt); streams.push_back(StreamInfo(fmt, w, h, (w*fmt.bpp)/8)); size_bytes = lSize; Start(); }