QML Camera: передача изображения в C++ код

от автора

В данной статье рассмотрен пример приложения, написанного с использованием Qt 5 и Qt Multimedia, которое использует QML-компонент Camera и передаёт изображение в C++ код для дальнейшей обработки.

Начнём с написания класса ImageProcessor, который мы будем использовать в качестве модуля QML.
Ниже приведён файл заголовка ImageProcessor, в нём определён слот processImage(), который может быть вызван из QML кода.

#ifndef IMAGEPROCESSOR_H #define IMAGEPROCESSOR_H  #include <QObject>  class ImageProcessor : public QObject {     Q_OBJECT public:     explicit ImageProcessor(QObject *parent = 0);   public slots:     void processImage(const QString& image);    }; #endif // IMAGEPROCESSOR_H 

Далее приведёна реализация класса ImageProcessor. Функция processImage() принимает изображение от поставщика изображений (image provider). Как только в неё будет передано валидое изображение, мы сможем каким-либо образом обработать его.

#include "imageprocessor.h" #include <QtQml/QmlEngine> #include <QtQml/QmlContext> #include <QtQuick/QQuickImageProvider> #include <QDebug>  ImageProcessor::ImageProcessor(QObject *parent) : QObject(parent) {}  void ImageProcessor::processImage(const QString& path) {     QUrl imageUrl(path);     QQmlEngine* engine = QQmlEngine::contextForObject(this)->engine();     QQmlImageProviderBase* imageProviderBase = engine->imageProvider(      imageUrl.host());     QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider>      (imageProviderBase);          QSize imageSize;     QString imageId = imageUrl.path().remove(0,1);     QImage image = imageProvider->requestImage(imageId, &imageSize, imageSize);     if( !image.isNull()) {         // обработка изображения     } } 

Теперь нам нужно зарегистрировать класс ImageProvider для того, чтобы мы могли использовать его в QML коде. Сделать это можно с помощью глобальной функции qmlRegisterType.

#include  <QtGui/QGuiApplication> #include  <QQmlEngine> #include  <QQmlComponent> #include  <QtQuick/QQuickView>  #include "imageprocessor.h"  int main(int argc, char *argv[]) {     qmlRegisterType<ImageProcessor>("ImageProcessor", 1, 0, "ImageProcessor");      QGuiApplication app(argc, argv);      QQuickView view;      QObject::connect(view.engine(),SIGNAL(quit()),&app,SLOT(quit()));         view.setSource(QUrl::fromLocalFile("qml/main.qml"));     view.show();      return app.exec(); } 

Всё, на этом с C++ частью покончено. Далее вы можете увидеть демонстрацию использования данного компонента.

import QtQuick 2.0 import QtMultimedia 5.0 import ImageProcessor 1.0  Rectangle {     width: 360     height: 360      // отображает live-поток с камеры     VideoOutput {         source: camera         anchors.fill: parent         focus : visible     }      // отображает захваченный кадр     Image {         id: photoPreview         anchors.fill: parent         fillMode: Image.PreserveAspectFit     }      Camera {         id: camera         imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash         captureMode: Camera.CaptureStillImage          exposure {             exposureCompensation: -1.0             exposureMode: Camera.ExposurePortrait         }          flash.mode: Camera.FlashRedEyeReduction          imageCapture {             onImageCaptured: {                 photoPreview.source = preview                 imageProcessor.processImage(preview);             }         }     }      MouseArea{         anchors.fill: parent         onClicked: {             camera.imageCapture.capture();         }     }      ImageProcessor{         id: imageProcessor     } } 

Спасибо за внимание.

ссылка на оригинал статьи http://habrahabr.ru/post/182658/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *