OpenCV в изображение FlyCapture2

У меня есть шмель2, и я использую flycapture SDK для захвата входящих изображений. Затем я преобразую левое изображение flycapture2 в формат openCV, чтобы выполнить с ним некоторые основные манипуляции. Затем я хотел бы отправить его обратно в Flycapture SDK, но я не могу понять, как это сделать. Чтобы конвертировать из Flycapture в OpenCV, я делаю следующее:

FlyCapture2::Image cf2Img; 
grabbedImage.Convert(FlyCapture2::PIXEL_FORMAT_BGR, &cf2Img ); 
unsigned int rowBytes = (double)cf2Img.GetReceivedDataSize()/(double)cf2Img.GetRows(); 
cv::Mat cvImage = cv::Mat( cf2Img.GetRows(), cf2Img.GetCols(), CV_8UC3, cf2Img.GetData(), rowBytes ); 

Затем я делаю свои манипуляции (определение порогов / обнаружение контуров / удаление фона и т. Д.), Затем я хотел бы передать это изображение обратно в Flycapture. Мои попытки конвертировать его обратно не сработали.

У кого-нибудь есть какой-нибудь код, который они использовали прежде, чтобы вернуть формат OpenCV обратно в Flycapture?

2 ответа

Я работаю на Пойнт Грей и постараюсь здесь помочь. Обратите внимание, что вы можете связаться с нами напрямую через наш сайт поддержки по адресу ptgrey.com/support/, и мы также можем помочь вам.

Глядя на код, который вы прикрепили, и на источник openCV, когда вы делаете cvImage, вы просто переназначаете указатель на данные, а не делаете фактическую копию данных.

Таким образом, до тех пор, пока размер данных остается неизменным (т. Е. Вы сохраняете его на уровне 24 бит на пиксель), любые изменения, которые вы вносите в изображение openCV, должны отражаться в данных flycapture (cf2Img) и иметь возможность сохранять данные должным образом.

Если вы можете объяснить проблемы, с которыми вы пытаетесь вернуться к изображению flycapture, или отправить нам исходный код того, как вы это делаете, мы можем помочь вам в дальнейшем.

Подводя итог, я ожидаю, что любые ваши манипуляции с cvImage после того, как предоставленный вами код должен быть просто отражен в cf2Img без необходимости обратного преобразования, при условии, что вы не меняете битовую глубину изображения.

Я надеюсь, что это поможет, но, пожалуйста, дайте мне знать, если я могу помочь уточнить что-нибудь или вы можете привести пример неудачной конвертации обратно в fc2.

Спасибо, Point Grey "- поддержка

С 8-битным изображением в оттенках серого я решил сделать это с помощью FlyCapture2 v2.13.3.61_x64 и Visual Studio:

        using namespace FlyCapture2;
  [...]   
 
  Camera cam;
  [...] 

  // Acquire the image 
  cam.RetrieveBuffer(&image);
  if (error != PGRERROR_OK)
  {
    PrintError(error);
    break;
  }

  // Copy FlyCapture2 image into OpenCV struct
  // convert to rgb
  Image rgbImage;
  image.Convert( FlyCapture2::PIXEL_FORMAT_BGR, &rgbImage );

  // convert to OpenCV Mat
  unsigned int rowBytes = 
           (double)rgbImage.GetReceivedDataSize()/(double)rgbImage.GetRows();
       
  cv::Mat img = cv::Mat(rgbImage.GetRows(), rgbImage.GetCols(), CV_8UC3, 
                        rgbImage.GetData(),rowBytes);

  // show the captured image
  cv::imshow("image", img);
  key = cv::waitKey(30);   

Для меня это тоже хорошо:

      
using namespace FlyCapture2;

const int col_size   = 24;
const int row_size   = 480;
const int data_size  = row_size * col_size;

[...]

// Grab camera grayscale image and convert into
// an OpenCV image
void GrabImages( Camera* pcam,
                 IplImage* pimg,
                 IplImage* pimg_bw,
                 CvMemStorage* pstorage,
                 int cnt )
{
    Image image;
    [...]
 
    // Retrieve image before starting main loop
    Error error = pcam->RetrieveBuffer( &image );
    if ( error != PGRERROR_OK )
    {
        // TODO.
    }
 
    // Copy FlyCapture2 image into OpenCV struct
    memcpy( pimg->imageData, image.GetData(), data_size );
 
    // Save the bitmap to file
    cvSaveImage( "orig.bmp", pimg );

    [...]

Другие вопросы по тегам