Canon LiveView: преобразование изображений в OpenCV Mat

Я пытаюсь показать изображение в реальном времени. Я использую EDSDK 2.14 + Qt5 + opencv + mingw32 под Windows. Я не очень опытен в обработке изображений, поэтому теперь у меня есть следующая проблема. Я использую пример от Canon EDSDK, и все было хорошо, пока эта часть кода:

//
// Display image
//

Я погуглил много примеров, но все они были написаны на C # или MFC или VB. Также я посоветовал использовать libjpegTurbo для распаковки изображения, а затем показать его с помощью opencv. Я пытался использовать libjpegTurbo, но не смог понять, что делать :(. Может, у кого-нибудь здесь есть пример кода преобразования потока LiveView в opencv Mat или QImage (потому что я использую Qt)?

1

Решение

На основе примера Canon EDSDK вы можете добавить свои «потоковые» данные EdsStreamRef с их правильной длиной в QByteArray, Затем используйте, например, следующее для анализа необработанных данных из QByteArray как JPG в новый QImage:
QImage my_image = QImage::fromData(limagedata,"JPG"); Как только он окажется в QImage, вы можете преобразовать его в OpenCV cv :: Mat (см. Как конвертировать QImage в OpenCV Mat)

2

Другие решения

Вот что сработало для меня после следования ОБРАЗЦУ 10 из Справочника Canon EDSDK. Это отправная точка для более надежного решения.

В функции downloadEvfData я заменил часть «Отображение изображения» на код ниже:

unsigned char *data = NULL;
EdsUInt32 size = 0;
EdsSize coords ;

// get image coordinates
EdsGetPropertyData(evfImage, kEdsPropsID_Evf_CoordinateSystem, 0, sizeof(coords), &coords);

// get buffer pointer and size
EdsGetPointer(stream, (EdsVoid**)&data);
EdsGetLenth(stream, &size);

//
// release stream and evfImage
//

// create mat object
Mat img(coords.height, coords.width, CV_8U, data);
image = imdecode(img, CV_LOAD_IMAGE_COLOR);

Я также изменил сигнатуру функции:

EdsError downloadEvfData(EdsCameraRef camera, Mat& image)

И в основной функции:

Mat image;
namedWindow("main", WINDOW_NORMAL);
startLiveView(camera);
for(;;) {
dowloadEvfData(camera, image);
imshow("main", image);
if (waitkey(10) >= 0);
break;
}
4

Ну, это зависит от формата liveview-потока.

В нем должен быть какой-то разделитель, и вам нужно затем преобразовать каждое изображение и обновить им QImage.

Проверьте этот учебник для получения дополнительной информации: Canon EDSDK учебник в C #

0

Ну, я знаю, как конвертировать поток LiveView, используя c #, Vb, MFC и ATL, но моя идея — создать многоплатформенное приложение, поэтому я выбираю C ++ + Qt. Я не хочу использовать библиотеки Microsoft и языки программирования

0
По вопросам рекламы [email protected]