Я пытаюсь показать изображение в реальном времени. Я использую EDSDK 2.14 + Qt5 + opencv + mingw32 под Windows. Я не очень опытен в обработке изображений, поэтому теперь у меня есть следующая проблема. Я использую пример от Canon EDSDK, и все было хорошо, пока эта часть кода:
//
// Display image
//
Я погуглил много примеров, но все они были написаны на C # или MFC или VB. Также я посоветовал использовать libjpegTurbo для распаковки изображения, а затем показать его с помощью opencv. Я пытался использовать libjpegTurbo, но не смог понять, что делать :(. Может, у кого-нибудь здесь есть пример кода преобразования потока LiveView в opencv Mat или QImage (потому что я использую Qt)?
На основе примера Canon EDSDK вы можете добавить свои «потоковые» данные EdsStreamRef с их правильной длиной в QByteArray
, Затем используйте, например, следующее для анализа необработанных данных из QByteArray как JPG в новый QImage:
QImage my_image = QImage::fromData(limagedata,"JPG");
Как только он окажется в QImage, вы можете преобразовать его в OpenCV cv :: Mat (см. Как конвертировать QImage в OpenCV Mat)
Вот что сработало для меня после следования ОБРАЗЦУ 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;
}
Ну, это зависит от формата liveview-потока.
В нем должен быть какой-то разделитель, и вам нужно затем преобразовать каждое изображение и обновить им QImage.
Проверьте этот учебник для получения дополнительной информации: Canon EDSDK учебник в C #
Ну, я знаю, как конвертировать поток LiveView, используя c #, Vb, MFC и ATL, но моя идея — создать многоплатформенное приложение, поэтому я выбираю C ++ + Qt. Я не хочу использовать библиотеки Microsoft и языки программирования