web-dev-qa-db-ja.com

QMLカメラコンポーネントからC ++プラグインに画像プレビューを渡す方法

カメラデバイスから画像をキャプチャして処理するUbuntu Touch QMLアプリを書いています。処理は、画像のURLを渡すC++プラグインによって行われます。

画像を正常に保存してC++プラグインから読み込むことはできますが、最初に画像をファイルシステムに保存し、代わりにメモリ内カメラプレビューをプラグインに渡す必要はありません。

カメラから取得しているプレビューのURL(image://camera/preview_1)を考えると、"camera"image provider への参照を取得できるはずです。そして requestImage() メソッドを使用して画像を取得します。

ただし、cameraイメージプロバイダーを取得する方法を理解できませんでした。コードは次のとおりです。

QString Decoder::decodeImageQML(const QUrl &imgUrl)
{
    /* 
     * @imgUrl: URL to the camera preview. E.g. image://camera/preview_1
     */

    QQmlEngine * engine;
    QQuickImageProvider *imageProvider = 0;

    // FIXME: this does not work, I'm not sure how to get hold of 
    // the image provider
    imageProvider = engine->imageProvider("camera");

    QImage image = imageProvider->requestImage(("preview_1", &size, QSize());

    return Decoder::decodeImage(image);
}

cameraイメージプロバイダーへの参照を取得するにはどうすればよいですか?

7
David Planella

次の構文を使用して、有効なエンジンインスタンスを取得できます。

QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();

そして、画像プロバイダーのポインターを取得するには、次のようなことができます、

QQmlImageProviderBase* imageProviderBase = engine->imageProvider(item.Host());
QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);

QQuickImageProviderはQQmlImageProviderBaseから派生しているため、このキャストは問題ないと思います。エンジンからQQuickImageProviderのポインターを取得する方法がわからない。

4
Kunal

C++でプレビューイメージを取得するには、QML Camera要素の mediaObject プロパティをC++に渡す必要があります。 camera-appのコード を例として見ることができます。

そのmediaObjectQCameraImageCapture を使用してみてください。しかし、それがうまくいくかどうかはわかりません。ただし、必要なimageCaptured信号があります。プレビューには QImage があります。

void AdvancedCamera::setCamera(QObject *cameraObject)
{
    QVariant cameraVariant = cameraObject->property("mediaObject");
    QCamera *camera = qvariant_cast<QCamera*>(cameraVariant);
    QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);
    QObject::connect(imageCapture, SIGNAL(imageCaptured(int, const QImage&))
        myObject, SLOT(processPreview(int, const QImage&)));
}

動作しない場合は、 QMediaServiceQCameraImageCaptureControl を使用する別の方法があります。

void AdvancedCamera::setCamera(QObject *cameraObject)
{
    QVariant cameraVariant = cameraObject->property("mediaObject");
    QCamera *camera = qvariant_cast<QCamera*>(cameraVariant);
    QMediaService *service = camera->service();
    QMediaControl *control = service->requestControl(QCameraImageCaptureControl_iid);
    QCameraImageCaptureControl *captureControl = qobject_cast<QCameraImageCaptureControl*>(control);
    QObject::connect(captureControl, SIGNAL(imageCaptured(int, const QImage&))
        myObject, SLOT(processPreview(int, const QImage&)));
}

より良い例については、 camera-app のコードを見てください。

C++で QVideoFrame として配信される最終画像を取得するには、captureDestinationを設定する必要があります。しかし、それはUbuntu携帯電話のカメラバックエンドでは(まだ?)サポートされていません。

3
Günter Schwann