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

в 18:33, , рубрики: c++, QML, qt, qt quick, Qt Software, qt5, QtQuick

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
    }
}

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

Автор: epicfailguy93

Источник

Поделиться

* - обязательные к заполнению поля