2016-04-29 2 views
4

投稿して新しくなりましたので、よろしくお願いします。私はこれに関連する事実上すべての他の質問を見て、ほとんど試しましたが、完全に挫折しています。私は単に、私のAndroid携帯電話に、風景ではなくポートレートモードでカメラを表示させたいだけです。私は単にopencvで提供されているImageManipulationsサンプルを変更しています。Androidカメラを強制的にポートレートモードで表示する方法、または代わりに回転を行う方法

私はopencv 3.01、Android sdk version 23、Android Studio 2.0、Androidバージョン6.0.1のNexus 5電話を使用しています。これは4/28/2016です。これはすべての最新の安定バージョンです。

私はすでにとAndroidManifest.xmlファイルにポートレートモードにアプリを余儀なくされています:

   android:screenOrientation="portrait" 

、全体のアプリが正しくポートレートモードで表示されますが、表示されたカメラ画像を90度回転させます。言い換えると、頭を90度左に傾けると、適切な画像が表示されます。だから私は右にイメージを回転する必要があります。

私はOpenCVのTutorial3コードとsetDisplayOrientation(90)を使用してみました:

public void setResolution(Size resolution) { 
    disconnectCamera(); 
    mMaxHeight = resolution.height; 
    mMaxWidth = resolution.width; 
    // mCamera.setDisplayOrientation(90); //* Crashes if placed here 
    connectCamera(getWidth(), getHeight()); 
    mCamera.setDisplayOrientation(90); //* Doesn't crash if here, but doesn't work either 
} 

を、それは動作しませんでした。いずれにしても、このチュートリアルでは、Androidバージョン21で廃止予定の「カメラ」クラスを使用し、「camera2」クラスに置き換えました。最新のAPIを使いたいと思ったので、私はこれ以上遠慮しませんでしたが、おそらくcamera2の何かが動作するかもしれません。

一部の人々は、画像を回転させる「転置」使用と「フリップ」機能について投稿し、私はonCameraFrame方法で、この多くの方法をやってみました:

オリジナル、動作しますが、回転:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    Mat rgba = inputFrame.rgba(); 
    ... do stuff to the image ... 
    return rgba; 

画像の表示が消灯し、私のFPSの計算はゼロ(変な)に行く::

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    Mat rgba = inputFrame.rgba(); 

    // Rotate clockwise 90 degrees 
    Core.transpose(rgba, rgba); 
    Core.flip(rgba, rgba, 1); 
    ... do stuff to the image ... 
    return rgba; 

180度回転させ、ビデオディスプレイは再び、今はまだlandscapひっくり返さが、 Eモード:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    Mat rgba = inputFrame.rgba(); 

    // Rotate clockwise 90 degrees, then 90 degrees again 
    Core.transpose(rgba, rgba); 
    Core.flip(rgba, rgba, 1); 
    Core.transpose(rgba, rgba); 
    Core.flip(rgba, rgba, 1); 
    ... do stuff to the image ... 
    return rgba; 

onCameraFrameがオリジナルと異なる解像度のマットを返した場合、表示が空白になるようなので、それが見えます。 onCameraFrameのドキュメントはスケッチです - そうですか?

onCameraFrameが呼び出される前にこのイメージローテーションを実行する必要がある別の場所がありますか?別の方法では、代わりにポートレートモードでフレームを提供するようにカメラに強制することはできますか?

+0

私は以前のバージョンのopencv --version 2.4.11に戻って、それが役立つかどうかを確認しました。また、提供されたサンプルをまったく動作させるための問題が発生しました:https://stackoverflow.com/質問/ 36977202/how-to-get-opencv-samples-to-work-with-android-studio-2-1/37126957#37126957まだ愛はありません。 –

答えて

0

setDisplayOrientationは、カメラの標準プレビュー出力(camearに直接接続されたSurfaceViewまたはTextureView)で動作しますが、OpenCVは中央にあり、データを受け取る方法はsetDisplayOrientationの影響を受けません。

転置はイメージ配列の寸法を変更し、サンプルの残りの部分でこれを処理する方法が分からない限り、問題が発生します。コードをトレースして、バッファサイズ(たとえば、UIに描画される出力バッファ)に関する仮定がどこにあるかを確認し、転置を挿入するポイントを過ぎた転置サイズに合わせて更新します。

理想的には、OpenCVが描画する出力Viewに向きを設定する方法がありますが、そのようなコントロールが存在するかどうかをOpenCVのサンプルで十分に知ることはできません。

+0

いただきありがとうございますが、十分分かりません。誰かが私にopencvサンプルプロジェクトのどこにコードを挿入するかを教えてくれることを願っていました。 opencvライブラリ自体にはないのが望ましい。 –

関連する問題