カメラデバイスから画像をキャプチャして処理する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
イメージプロバイダーへの参照を取得するにはどうすればよいですか?
次の構文を使用して、有効なエンジンインスタンスを取得できます。
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
そして、画像プロバイダーのポインターを取得するには、次のようなことができます、
QQmlImageProviderBase* imageProviderBase = engine->imageProvider(item.Host());
QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QQuickImageProviderはQQmlImageProviderBaseから派生しているため、このキャストは問題ないと思います。エンジンからQQuickImageProviderのポインターを取得する方法がわからない。
C++でプレビューイメージを取得するには、QML Camera要素の mediaObject プロパティをC++に渡す必要があります。 camera-appのコード を例として見ることができます。
そのmediaObject
で QCameraImageCapture を使用してみてください。しかし、それがうまくいくかどうかはわかりません。ただし、必要な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&)));
}
動作しない場合は、 QMediaService の QCameraImageCaptureControl を使用する別の方法があります。
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携帯電話のカメラバックエンドでは(まだ?)サポートされていません。