В данной статье рассмотрен пример приложения, написанного с использованием 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