...

воскресенье, 9 июня 2013 г.

[Перевод] 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
}
}




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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий