2016-03-21 2 views
0

У меня есть формат «rgb8» msg доставляется через подписку на тему ROS. Как создать QImage из него и позволить qml Image отображать на нем изображение? В настоящее время я работаю над следующим фрагментом кода.Совместимость формата изображения между ROS QImage

QImage *VideoPlayer::Mat2QImage(cv::Mat const& src) 
{ 
    QImage *imgPtr = new QImage((const uchar *) src.data, 
       src.cols, src.rows, src.step, QImage::Format_RGB888); 
    imgPtr->bits(); 
    return imgPtr; 
} 

void VideoPlayer::imageCallback(const sensor_msgs::ImageConstPtr& msg) 
{ 
    static int count = 0; 
    try 
    { 
    try { 
     Mat imgMat = cv_bridge::toCvShare(msg, "rgb8")->image; 

     delete imgProvider->currentShot; 
     imgProvider->currentShot = Mat2QImage(imgMat); 
    ... 
} 

(* currentShot) является fecthed по imageRequest (...) метод из свойства 'источника' QML стороны.

ответ

0

Вы должны обратиться к QQuickImageProvider. Создание Q класса ROSImageProvider, которые наследуют QQuickImageProvider и осуществлять requestImage() или requestPixmap(), а затем зарегистрировать его в QMLEngine:

engine->addImageProvider(QLatin1String("ros"), new ROSImageProvider); 

И тогда вы можете, используя следующий синтаксис QML, чтобы получить изображение:

Image { source: "ros://some_id" } 

Для полного примера вы можете обратиться к документации Qt.

+0

Спасибо, но мой qml уже вызвал метод requestImage() по мере необходимости. Проблема в qml. Изображение не отображает переданное изображение (я думаю). Итак, я думаю, что я не знаю формат кодировки изображений или что-то в этом роде. В файле qml у меня есть этот раздел: «Изображение {... source:" image: // images/"+ imageSN ...}" –

+0

1. Вы пытались сохранить QImage в файл и проверить его? 2. Есть ли сообщение об ошибке в отладочном сообщении? – diro

+0

На самом деле, я просто сделал это. Он сохраняет файл png правильно. Это делается с помощью «imgProvider-> currentShot-> save (« delta.png »); - эта команда. Здесь currentShot является указателем на QImage. –