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 );
[...]