bool PleoraVideo::GrabNewest( unsigned char* image, bool wait ) { PvBuffer *lBuffer0 = NULL; PvBuffer *lBuffer = NULL; PvResult lOperationResult; const uint32_t timeout = wait ? 0xFFFFFFFF : 0; PvResult lResult = lStream->RetrieveBuffer( &lBuffer, &lOperationResult, timeout ); if ( !lResult.IsOK() ) { pango_print_warn("Pleora error: %s\n", lResult.GetCodeString().GetAscii() ); return false; }else if( !lOperationResult.IsOK() ) { pango_print_warn("Pleora error: %s\n", lOperationResult.GetCodeString().GetAscii() ); lStream->QueueBuffer( lBuffer ); return false; } // We have at least one frame. Capture more until we fail, 0 timeout while(true) { PvResult lResult = lStream->RetrieveBuffer( &lBuffer0, &lOperationResult, 0 ); if ( !lResult.IsOK() ) { break; }else if( !lOperationResult.IsOK() ) { lStream->QueueBuffer( lBuffer0 ); break; }else{ lStream->QueueBuffer( lBuffer ); lBuffer = lBuffer0; } } bool good = false; PvPayloadType lType = lBuffer->GetPayloadType(); if ( lType == PvPayloadTypeImage ) { PvImage *lImage = lBuffer->GetImage(); std::memcpy(image, lImage->GetDataPointer(), size_bytes); good = true; } lStream->QueueBuffer( lBuffer ); return good; }
void MLTCam::WaitForExecution() { qDebug() << "MLTCam::Wait for execution..."; PvBuffer *lBuffer = NULL; PvResult lOperationResult; // Retrieve next buffer PvResult lResult = lStream->RetrieveBuffer( &lBuffer, &lOperationResult, 1000 ); if ( lResult.IsOK() ) { if ( lOperationResult.IsOK() ) { qDebug() << "MLTCam::Get image complete"; PvImage *lImage2 = lBuffer->GetImage(); ushort * tdata = (ushort*)lImage2->GetDataPointer(); memcpy(data, tdata, IMAGE_WIDTH*IMAGE_HEIGHT*2); timer->stop(); delete timer; emit GetDataComplete(data); lDevice->StreamDisable(); } // Re-queue the buffer in the stream object lStream->QueueBuffer( lBuffer ); } }
bool PleoraVideo::GrabNext( unsigned char* image, bool /*wait*/ ) { PvBuffer *lBuffer = NULL; PvResult lOperationResult; // Retrieve next buffer PvResult lResult = lStream->RetrieveBuffer( &lBuffer, &lOperationResult, 1000 ); if ( !lResult.IsOK() ) { pango_print_warn("Pleora error: %s\n", lResult.GetCodeString().GetAscii() ); return false; } bool good = false; if ( lOperationResult.IsOK() ) { PvPayloadType lType = lBuffer->GetPayloadType(); if ( lType == PvPayloadTypeImage ) { PvImage *lImage = lBuffer->GetImage(); std::memcpy(image, lImage->GetDataPointer(), size_bytes); good = true; } } else { pango_print_warn("Pleora error: %s\n", lOperationResult.GetCodeString().GetAscii() ); } lStream->QueueBuffer( lBuffer ); return good; }
int ImperxStream::Snap(cv::Mat &frame, int timeout) { // std::cout << "ImperxStream::Snap starting" << std::endl; // The pipeline is already "armed", we just have to tell the device // to start sending us images lDeviceParams->ExecuteCommand( "AcquisitionStart" ); int lWidth, lHeight, result = 0; // Retrieve next buffer PvBuffer *lBuffer = NULL; PvResult lOperationResult; PvResult lResult = lPipeline.RetrieveNextBuffer( &lBuffer, timeout, &lOperationResult ); if ( lResult.IsOK() ) { if ( lOperationResult.IsOK() ) { // Process Buffer if ( lBuffer->GetPayloadType() == PvPayloadTypeImage ) { // std::cout << "ImperxStream::Snap Copying frame" << std::endl; // Get image specific buffer interface PvImage *lImage = lBuffer->GetImage(); // Read width, height lWidth = (int) lImage->GetWidth(); lHeight = (int) lImage->GetHeight(); unsigned char *img = lImage->GetDataPointer(); cv::Mat lframe(lHeight,lWidth,CV_8UC1,img, cv::Mat::AUTO_STEP); lframe.copyTo(frame); result = 0; } else { std::cout << "ImperxStream::Snap No image in buffer" << std::endl; result = 1; } } else { std::cout << "ImperxStream::Snap Operation result: " << lOperationResult << std::endl; result = 1;; } // We have an image - do some processing (...) and VERY IMPORTANT, // release the buffer back to the pipeline } else { std::cout << "ImperxStream::Snap Timeout: " << lResult << std::endl; result = 1; } lPipeline.ReleaseBuffer( lBuffer ); // std::cout << "ImperxStream::Snap Exiting" << std::endl; return result; }
void ImperxStream::Stream(unsigned char *frame, Semaphore &frame_semaphore, Flag &stream_flag) { // The pipeline is already "armed", we just have to tell the device // to start sending us images printf( "Sending StartAcquisition command to device\n" ); lDeviceParams->ExecuteCommand( "AcquisitionStart" ); char lDoodle[] = "|\\-|-/"; int lDoodleIndex = 0; PvInt64 lImageCountVal = 0; double lFrameRateVal = 0.0; double lBandwidthVal = 0.0; // Acquire images until the user instructs us to stop printf( "\n<press a key to stop streaming>\n" ); while ( stream_flag.check() ) { std::cout << "here\n"; // Retrieve next buffer PvBuffer *lBuffer = NULL; PvResult lOperationResult; PvResult lResult = lPipeline.RetrieveNextBuffer( &lBuffer, 1000, &lOperationResult ); if ( lResult.IsOK() ) { if ( lOperationResult.IsOK() ) { // Process Buffer lStreamParams->GetIntegerValue( "ImagesCount", lImageCountVal ); lStreamParams->GetFloatValue( "AcquisitionRateAverage", lFrameRateVal ); lStreamParams->GetFloatValue( "BandwidthAverage", lBandwidthVal ); // If the buffer contains an image, display width and height PvUInt32 lWidth = 0, lHeight = 0; if ( lBuffer->GetPayloadType() == PvPayloadTypeImage ) { // Get image specific buffer interface PvImage *lImage = lBuffer->GetImage(); // Read width, height lWidth = lBuffer->GetImage()->GetWidth(); lHeight = lBuffer->GetImage()->GetHeight(); stream_flag.raise(); } std::cout << lWidth << " " << lHeight << "\n"; } // We have an image - do some processing (...) and VERY IMPORTANT, // release the buffer back to the pipeline //semaphore thing //get all in there. //a semaphore thing lPipeline.ReleaseBuffer( lBuffer ); } else { // Timeout printf( "%c Timeout\r", lDoodle[ lDoodleIndex ] ); } ++lDoodleIndex %= 6; } }
void ImperxStream::Snap(cv::Mat &frame) { // The pipeline is already "armed", we just have to tell the device // to start sending us images printf( "Sending StartAcquisition command to device\n" ); lDeviceParams->ExecuteCommand( "AcquisitionStart" ); char lDoodle[] = "|\\-|-/"; int lDoodleIndex = 0; PvInt64 lImageCountVal = 0; double lFrameRateVal = 0.0; double lBandwidthVal = 0.0; std::cout << "here\n"; // Retrieve next buffer PvBuffer *lBuffer = NULL; PvResult lOperationResult; PvResult lResult = lPipeline.RetrieveNextBuffer( &lBuffer, 1000, &lOperationResult ); if ( lResult.IsOK() ) { if ( lOperationResult.IsOK() ) { // Process Buffer lStreamParams->GetIntegerValue( "ImagesCount", lImageCountVal ); lStreamParams->GetFloatValue( "AcquisitionRateAverage", lFrameRateVal ); lStreamParams->GetFloatValue( "BandwidthAverage", lBandwidthVal ); // If the buffer contains an image, display width and height int lWidth = 0, lHeight = 0; if ( lBuffer->GetPayloadType() == PvPayloadTypeImage ) { // Get image specific buffer interface PvImage *lImage = lBuffer->GetImage(); // Read width, height lWidth = (int) lImage->GetWidth(); lHeight = (int) lImage->GetHeight(); unsigned char *img = lImage->GetDataPointer(); // cv::Mat lframe(lHeight,lWidth,CV_8UC1,img, cv::Mat::AUTO_STEP); // lframe.copyTo(frame); for (int m = 0; m < lHeight; m++) { for (int n = 0; n < lWidth; n++) { frame.at<unsigned char>(m,n) = img[m*lWidth + n]; // std::cout << (short int) img[n*lHeight +m] << " "; } } } else { std::cout << "No image\n"; } std::cout << lWidth << " " << lHeight << "\n"; } else { std::cout << "Damaged Result\n"; } // We have an image - do some processing (...) and VERY IMPORTANT, // release the buffer back to the pipeline //semaphore thing //get all in there. //a semaphore thing lPipeline.ReleaseBuffer( lBuffer ); } else { std::cout << "Timeout\n"; } ++lDoodleIndex %= 6; }
bool StartSlave() { // Let the user select the device to receive from PvString lDeviceIP; if ( !SelectDevice( lDeviceIP ) ) { return false; } // Create the PvStream object PvStream lStream; // Create the PvPipeline object PvPipeline lPipeline( &lStream ); // Create a PvPipeline event sink (used to trap buffer too small events) PipelineEventSink lPipelineEventSink; lPipeline.RegisterEventSink( &lPipelineEventSink ); // Open stream printf( "Opening stream\n" ); lStream.Open( lDeviceIP, "239.192.1.1", 1042 ); // IMPORTANT: the pipeline needs to be "armed", or started before // we instruct the device to send us images printf( "Starting pipeline\n" ); lPipeline.SetBufferCount( 16 ); lPipeline.Start(); // Get stream parameters/stats PvGenParameterArray *lStreamParams = lStream.GetParameters(); PvGenInteger *lCount = dynamic_cast<PvGenInteger *>( lStreamParams->Get( "ImagesCount" ) ); PvGenFloat *lFrameRate = dynamic_cast<PvGenFloat *>( lStreamParams->Get( "AcquisitionRateAverage" ) ); PvGenFloat *lBandwidth = dynamic_cast<PvGenFloat *>( lStreamParams->Get( "BandwidthAverage" ) ); PvGenBoolean *lIgnoreMissingPackets = dynamic_cast<PvGenBoolean *>( lStreamParams->Get( "IgnoreMissingPackets" ) ); // Disabling resend packets lIgnoreMissingPackets->SetValue( true ); char lDoodle[] = "|\\-|-/"; int lDoodleIndex = 0; PvInt64 lImageCountVal = 0; double lFrameRateVal = 0.0; double lBandwidthVal = 0.0; // Acquire images until the user instructs us to stop printf( "\n<press a key to stop receiving>\n" ); while ( !PvKbHit() ) { // Retrieve next buffer PvBuffer *lBuffer = NULL; PvResult lOperationResult; PvResult lResult = lPipeline.RetrieveNextBuffer( &lBuffer, 1000, &lOperationResult ); if ( lResult.IsOK() ) { if (lOperationResult.IsOK()) { // // We now have a valid buffer. This is where you would typically process the buffer. // ----------------------------------------------------------------------------------------- // ... lCount->GetValue( lImageCountVal ); lFrameRate->GetValue( lFrameRateVal ); lBandwidth->GetValue( lBandwidthVal ); // If the buffer contains an image, display width and height PvUInt32 lWidth = 0, lHeight = 0; if ( lBuffer->GetPayloadType() == PvPayloadTypeImage ) { // Get image specific buffer interface PvImage *lImage = lBuffer->GetImage(); // Read width, height lWidth = lBuffer->GetImage()->GetWidth(); lHeight = lBuffer->GetImage()->GetHeight(); } printf( "%c BlockID: %016llX W: %i H: %i %.01f FPS %.01f Mb/s\r", lDoodle[ lDoodleIndex ], lBuffer->GetBlockID(), lWidth, lHeight, lFrameRateVal, lBandwidthVal / 1000000.0 ); } // We have an image - do some processing (...) and VERY IMPORTANT, // release the buffer back to the pipeline lPipeline.ReleaseBuffer( lBuffer ); } else { // Timeout printf( "%c Timeout\r", lDoodle[ lDoodleIndex ] ); } ++lDoodleIndex %= 6; } PvGetChar(); // Flush key buffer for next stop printf( "\n\n" ); // We stop the pipeline - letting the object lapse out of // scope would have had the destructor do the same, but we do it anyway printf( "Stop pipeline\n" ); lPipeline.Stop(); // Now close the stream. Also optionnal but nice to have printf( "Closing stream\n" ); lStream.Close(); // Unregister pipeline event sink. Optional but nice to have. lPipeline.UnregisterEventSink( &lPipelineEventSink ); return true; }
int main( int aCount, const char ** aArgs ) { // Creates default configuration, parse command line parameters. Config lConfig; lConfig.ParseCommandLine( aCount, aArgs ); const std::string lVideoFile = lConfig.GetVideoFile(); cout << "Video file: " << lVideoFile << endl; // Open the video source. VideoSource lSource( lVideoFile ); lSource.OpenVideoFile(); // Get video source properties. PvUInt32 lWidth = lSource.GetWidth(); PvUInt32 lHeight = lSource.GetHeight(); PvPixelType lPixelFormat = PvPixelBGR8; PvUInt32 lBitsPerPixel = PvGetPixelBitCount( lPixelFormat ); PvUInt32 lSize = ( lWidth * lHeight * lBitsPerPixel ) / 8; // Allocate transmit buffers. PvBufferList lBuffers; PvBufferList lFreeBuffers; for ( PvUInt32 i = 0; i < lConfig.GetBufferCount(); i++ ) { // Create, allocate buffer. PvBuffer *lBuffer = new PvBuffer(); lBuffer->GetImage()->Alloc( lWidth, lHeight, lPixelFormat ); // Add to both buffer and free buffer list. lBuffers.push_back( lBuffer ); lFreeBuffers.push_back( lBuffer ); } // Create transmitter, set packet size. PvTransmitterRaw lTransmitter; lTransmitter.SetPacketSize( lConfig.GetPacketSize() ); // Create virtual device (used for discovery). PvVirtualDevice lDevice; lDevice.StartListening( lConfig.GetSourceAddress() ); cout << "Listening for device discovery requests on " << lConfig.GetSourceAddress() << endl; // Open transmitter - sets destination and source. PvResult lResult = lTransmitter.Open( lConfig.GetDestinationAddress(), lConfig.GetDestinationPort(), lConfig.GetSourceAddress(), lConfig.GetSourcePort() ); if ( !lResult.IsOK() ) { cout << "Failed to open a connection to the transmitter." << endl; return 1; } cout << "Transmission stream opened:" << endl; cout << "Source: " << lTransmitter.GetSourceIPAddress().GetAscii() << " port " << lTransmitter.GetSourcePort() << endl; cout << "Destination: " << lConfig.GetDestinationAddress() << " port " << lConfig.GetDestinationPort() << endl; if ( !lConfig.GetSilent() ) { cout << "Press any key to begin transmitting.\r"; PvWaitForKeyPress(); } cout << "Press any key to stop transmitting." << endl; // Set maximum throughput (just to even out traffic, as we control throughput at the source). if ( lConfig.GetFPS() != 0 ) { // Multiply image size (in bits) by FPS. float lMax = static_cast<float>( lSize ) * 8; lMax *= lConfig.GetFPS(); // Since we control throughput at the source, make sure maximum throughput is slightly // higher than what we need. We want to even out packet traffic, not slow down source frame rate. lMax *= 1.1f; // Set max throughput. lTransmitter.SetMaxPayloadThroughput( lMax ); } char lDoodle[] = "|\\-|-/"; int lDoodleIndex = 0; // Reset transmitter stats. lTransmitter.ResetStats(); // Used to transmit at a steady frame rate. PvFPSStabilizer lStabilizer; // Acquisition/transmission loop. while( !PvKbHit() ) { // Step 1: If timing is right to meet desired FPS, get the next image from the source and queue the buffer for transmission. if ( ( lConfig.GetFPS() == 0 ) || lStabilizer.IsTimeToDisplay( (PvUInt32)lConfig.GetFPS() ) ) { // Are there buffers available for transmission? if ( lFreeBuffers.size() > 0 ) { // Retrieve buffer from list. PvBuffer *lBuffer = lFreeBuffers.front(); lFreeBuffers.pop_front(); // Copy a new video frame into the buffer. if ( lSource.CopyImage( lBuffer ) ) { // Queue the buffer for transmission. lTransmitter.QueueBuffer( lBuffer ); } else { // No video frame, just put the buffer back in free buffers lFreeBuffers.push_front( lBuffer ); } } } // Step 2: Retrieve free buffer(s), display stats and requeue. PvBuffer *lBuffer = NULL; while ( lTransmitter.RetrieveFreeBuffer( &lBuffer, 0 ).IsOK() ) { // Queue buffers back in available buffer list. lFreeBuffers.push_back( lBuffer ); // Buffer transmission complete, dislay stats. cout << fixed << setprecision( 1 ); cout << lDoodle[ lDoodleIndex ] << " "; cout << "Transmitted " << lTransmitter.GetBlocksTransmitted() << " blocks "; cout << "at " << lTransmitter.GetAverageTransmissionRate() << " "; cout << "(" << lTransmitter.GetInstantaneousTransmissionRate() << ") FPS "; cout << lTransmitter.GetAveragePayloadThroughput() / 1000000.0f << " "; cout << "(" << lTransmitter.GetInstantaneousPayloadThroughput() / 1000000.0f << ") Mb/s \r"; ++lDoodleIndex %= 6; } } // Close transmitter (will abort queued buffers). lTransmitter.Close(); // Free buffers array, buffers. PvBufferList::iterator lIt = lBuffers.begin(); while ( lIt != lBuffers.end() ) { delete ( *lIt ); lIt++; } // Stop virtual device. lDevice.StopListening(); }
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; }