2015-12-11 1 views
0

У меня есть проблема преобразования (Pleora SDK) PvBuffer в буфер Opencv и обработка потока.PvBuffer (Pleora SDK) to -> буфер Opencv

это пример кода, я нашел в (Pleora SDK C++ коды образца)

while (!PvKbHit()) 
{ 
    PvBuffer *lBuffer = NULL; 
    PvResult lOperationResult; 
    PvBufferWriter lBufferWriter; 

    // Retrieve next buffer 
    PvResult lResult = aStream->RetrieveBuffer(&lBuffer, &lOperationResult, 1000); 
    if (lResult.IsOK()) 
    { 
     if (lOperationResult.IsOK()) 
     { 
      PvPayloadType lType; 

      // 
      // We now have a valid buffer. This is where you would typically process the buffer. 
      // ----------------------------------------------------------------------------------------- 

      lFrameRate->GetValue(lFrameRateVal); 
      lBandwidth->GetValue(lBandwidthVal); 

      // If the buffer contains an image, display width and height. 
      uint32_t lWidth = 0, lHeight = 0; 
      lType = lBuffer->GetPayloadType(); 

      cout << fixed << setprecision(1); 
      cout << lDoodle[ lDoodleIndex ]; 
      cout << " BlockID: " << uppercase << hex << setfill('0') << setw(16) << lBuffer->GetBlockID(); 

      if (lType == PvPayloadTypeImage) 
      { 
       // Get image specific buffer interface. 
       PvImage *lImage = lBuffer->GetImage(); 

       // Read width, height. 
       lWidth = lBuffer->GetImage()->GetWidth(); 
       lHeight = lBuffer->GetImage()->GetHeight(); 



       unsigned char * data = lBuffer->GetImage()->GetDataPointer(); 

       Mat OpencvImg = Mat(Size(lWidth, lHeight), CV_8UC1, data); 

       threshold(OpencvImg, OpencvImg, 100, 255, 0); 

если вы проверяете последние 3 строки, я пытаюсь преобразовать буфер в циновку, но без успеха. Я также хотел бы показать поток.

Заранее спасибо.

ответ

1

У меня был некоторый успех со следующим, однако этот результат действительно неэффективен, и я надеюсь найти способ сделать преобразование, не связанное с промежуточной записью на диск.

cv::Mat workImage; 
lBuffer->GetImage()->Alloc(lWidth, lHeight, PvPixelBGR8);    
lBufferWriter.Store(lBuffer, "ImageOriginal.bmp", PvBufferFormatBMP); 
workImage = cv::imread("ImageOriginal.bmp", CV_LOAD_IMAGE_COLOR); 

Edit (это работает):

cv::Mat workImage; 
PvImage* lImage = lBuffer->GetImage(); 
lImage->Alloc(lWidth, lHeight, PvPixelRGB8); 
// Get image data pointer so we can pass it to CV::MAT container 
unsigned char *img = lImage->GetDataPointer(); 
// Copy/convert Pleora Vision image pointer to cv::Mat container 
cv::Mat lframe(lHeight, lWidth, CV_8UC3, img, cv::Mat::AUTO_STEP); 
lframe.copyTo(workImage); 
+0

резюме :: Mat workImage; PvImage * lImage = lBuffer-> GetImage(); lImage-> Alloc (lWidth, lHeight, PvPixelRGB8); // Получить указатель данных изображения, чтобы мы могли передать его в контейнер CV :: MAT unsigned char * img = lImage-> GetDataPointer(); // Скопируйте/конвертируйте указатель изображения Pleora Vision в cv :: Контейнер Mat cv :: Mat lframe (lHeight, lWidth, CV_8UC3, img, cv :: Mat :: AUTO_STEP); // orig CV_8UC1 lframe.copyTo (workImage); – user7077193

+0

Это сработало, извините за странное форматирование, у меня нет большого опыта переполнения стека – user7077193

+0

А, я могу отредактировать свой оригинальный пост ... круто! – user7077193