2

Android用のopenCV(2.4.3)で画像をオーバーレイする方法を探しています。基本的に、私はいくつかの画像フィルタリングを行っており、ユーザーがきれいにフィルタリングされたビデオ ストリームを確認できるようにしたいのですが、上部の隅にフィルターの動作のプレビューが表示されます。

フィルター処理された画像に ROI を設定しようとしましたが、このような JNI コードで AddWeighted を使用しています

活動中:

liveFrame.copyTo(mRgba); //going to be used as the unfiltered stream

//image filtering happends here...

Rect roi = new Rect(0, 0, liveFrame.cols()/4, liveFrame.rows()/4);
mProcMat = new Mat(liveFrame, roi);
AddMats(mRgba.getNativeObjAddr(),mProcMat.getNativeObjAddr()); //will add the two, assign the result to mRgba

AddMats (ネイティブ メソッド):

Mat* image1=(Mat*)mat1;
Mat* image2 = (Mat*)mat2;
float alpha = 0.5;
float beta = 0.5;
addWeighted( (InputArray)*image1, alpha, (InputArray)*image2, beta, 0.0, (OutputArray)*image1);

しかし、画像のサイズが同じでなければならないため、これは機能しません。これを機能させる方法は考えられません。ライブ ストリームの上にある新しいビューにフレームを適用するだけでよいので、iOS ではこれを簡単に行うことができます。Android の場合、私の知る限り、カメラ入力ストリームごとに 1 つのサーフェス ビューしか持つことができません。それが私がopencvでこれを行う道をたどった理由ですが、この時点で任意の解決策を検討します

4

2 に答える 2

2

私の理解が正しければ、ライブ画像を変更せずに表示し、ライブ画像に何らかのフィルターを適用した結果を上隅に表示したいのですが、これは正しいですか? フィルタされたプレビューで画像全体を表示したいですか、それとも一部だけを表示したいですか?

これがあなたが望むことをすると私が思うアルゴリズムです:

ステップ 1: liveFrame のサイズを変更します (変更せずに、コピーを作成するか、内部でコピーを作成するサイズ変更メソッドを使用します)。元の画像よりも小さい新しい画像 (mProcMat と呼ばれます) になります。この質問を確認することをお勧めします。

ステップ 2: mProcMat に画像フィルタリングを適用します。

ステップ 3: mProcMat を liveFrame に配置するには、 liveFrame 上に ROI を作成します。これは、その右上に配置され、mProcMat と同じサイズです。ROI に submat を使用します。他の質問で見たことがありますか。3 つの異なる設定方法があるため、より柔軟です。

ステップ 4: AddMats(liveFrameROI.getNativeObjAddr(), mProcMat.getNativeObjAddr());

これはいい音ですか?

編集: 4 番目のステップの addWeighted を実行する必要はないと思います。プレビューを取得するには、ステップ 3 の ROI に mProcMat をペイントするだけです。

こちらのスレッドもチェックしてみてください。

于 2013-02-13T23:17:19.673 に答える
1

これについては前に話しましたが、透明でオーバーレイしたい場合は、次をご覧になることをお勧めします: OpenCV での透明な画像オーバーレイ

画像のいずれかのサイズを変更する必要がある場合は、このリンクを確認 してください。

于 2013-02-13T23:53:56.450 に答える