2017-12-27 9 views
1
@Override 
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 

    Mat rgb=inputFrame.rgba(); 
    for(int y=0;y<rgb.cols();++y){ 
     for(int x=0;x<rgb.rows();++x){ 
      double[]pixelValues=rgb.get(x,y); 
      double redVal=pixelValues[0]; 
      double greenVal=pixelValues[1]; 
      double blueVal=pixelValues[2]; 
      double alphaVal=pixelValues[3]; 
      double gryVal=(redVal+greenVal+blueVal)/3; 
      rgb.put(x,y,gryVal,gryVal,gryVal,alphaVal); 
     } 
    } 
    return rgb; 
} 

これは、JavaCameraViewコンポーネント内に表示されるcameraStreamのピクセル値を変更するためのコードです。これは非常に遅いです。 3 fps未満です。グレースケール画像を取得するより速い方法があることを知っています{.rgba() => .gray()またはImproc.cvt()}を使用しています。私は自分自身でピクセルを扱う自由が必要ですが。私の究極の目標は、私が好きなように赤、緑、青の色を調整できるものを得ることです。ピクセル単位の操作を適用するのが遅い

少なくともこれを30fps(滑らかなフレームレート)にする方法はありますか?

答えて

1

ネイティブの呼び出しのオーバーヘッドのために、すべてのピクセルのGetとPutの操作は確実にfpsを低下させます。代わりに、forループの外側ではgetおよびput操作をonce.ieだけ呼び出す必要があります。それらを取得/ Javaプリミティブ配列を作成し、操作を行います。この方法で独自のピクセル操作を行うことができ、パフォーマンスが大幅に向上します(imgproc.cvt()に近づく)。 http://answers.opencv.org/question/5/how-to-get-and-modify-the-pixel-of-mat-in-java/ これは、単一のゲット/プットコール(実際の回答だけでなく、コメントにも表示)を行う方法の例を示します。

+0

これで動作します。次にバイト[]についてです。だから思考は私がすべての赤の値を削除し、緑の値に置き換える必要があります。どのように私はforループを実装することができます..これはこのように行うことができますか?この配列は、{redVal、greenVAl、blueVal、redVal、...のように配列されていると仮定しています。 ......} これは本当ですか?それとも、他の方法がありますか? –

+2

あなたはBGRのformat.ie {B、G、R、B、G、R ...など}の値を取得します。あなたのforループはRチャンネルとGチャンネルを交換するために青チャンネルをスキップする必要があります。あなたは自分自身をやることができれば満足しているかもしれませんが、byte array.https://stackoverflow.com/questions/38412000/opencv-java-grayscale/38413469#38413469の使用には注意してください。このリンクを参照してください – hariprasad

+0

私はビデオとして保存するためにJavaCameraViewからフレームをキャプチャするために何をすべきか知っていますか?私はopencvのドキュメントを参照しましたが、答えを見つけられませんでした..私は操作されたフレームをキャプチャする必要があります。 –

関連する問題