2016-04-04 7 views
0

OpenCVライブラリを使用して画像処理用の文字を認識するAndroidアプリケーションで作業しています。Android用OpenCVを使用した画像処理のしきい値が無効です

私は最初にEclipseでJavaでコードを書いており、コードをAndroid Studioに転送しています。私が直面している問題は、この線がカメラプレビューに何の影響も与えないように見えるということです。通常の画像は効果がありません。ここで

は私の宣言私の宣言の一部です:

Mat rgba = inputFrame.rgba(); 
Size sizeRgba = rgba.size(); 

Mat rgbaInnerWindow; 

int rows = (int) sizeRgba.height; 
int cols = (int) sizeRgba.width; 

int left = cols/8; 
int top = rows/2; 

int width = cols * 3/4; 
int height = rows * 20/100; 

rgbaInnerWindow = rgba.submat(top, top + height, left, left + width); 

そして、ここでは、私が適用される方法です:

//Filtre Gaussien 
Imgproc.GaussianBlur(mIntermediateMat, rgbaInnerWindow, new org.opencv.core.Size(7, 7), 0, 3); 

//binarisation 
Imgproc.threshold(mIntermediateMat, rgbaInnerWindow, 181, 255, Imgproc.THRESH_BINARY); 

rgbaInnerWindow.release(); 

任意の助けを事前にありがとうございます!

+0

どの機能にしきい値処理のコードが含まれていますか? – Vasanth

+0

これは: 'Imgproc.threshold(mIntermediateMat、rgbaInnerWindow、181,255、Imgproc.THRESH_BINARY);' – OmarGhb

+0

申し訳ありません、私の質問を書いてください。 thershold関数は、すべてのフレームと呼ばれるカメラコールバック内に存在しますか? – Vasanth

答えて

0

問題を解決しました。私はそれを処理する前に画像をグレースケールにあったので、私はGaussianBlur目的球に最初のパラメータとしてinputFrame.gray()を配置:これらのエラーをなくす

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 

    Imgproc.GaussianBlur(inputFrame.gray(), mIntermediateMat, new org.opencv.core.Size(7, 7), 0 , 3); 
    Imgproc.threshold(mIntermediateMat, mRgba, 181, 255, Imgproc.THRESH_BINARY); 

    return mRgba; 
} 

また、アンドロイドStudioで新しいOpenCVのプロジェクトを設定する:

E/LoadedApk:それはあまりにも多くの時間onReceiveがかかり、onReceive時間 は:28051のMS意図である:{ 行為= android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE FLG = 0x4000010( 補足を有する)}意図

38フレームをスキップしました!アプリケーションがそのメインスレッドの で多すぎる作業を行っている可能性があります。

0

スレッシュホールド機能は、単一のチャネルイメージで動作し、別のシングルチャネルイメージを出力します。 rgbaInnerWindowは出力ディメンションと一致しない4チャンネルのMatですので、参照は削除され、新しいマトリックスが作成されます。したがって、rgbaを表示すると結果が表示されません。

はこれを試してみてください:

Imgproc.threshold(mIntermediateMat, mIntermediateMat, 181, 255, Imgproc.THRESH_BINARY); 
Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2RGBA); 

cvtColor()の出力は、あなたのrgbaInnerWindowrgbaが変更されますと一致します。

Core.merge()を使用して、4つのチャネルすべてで単一チャネルイメージを複製し、結果をrgbaInnerWindowにプッシュすることもできます。

+0

ありがとうございます。これを実行した後、Logcatに次のメッセージが表示されています: 'E/LoadedApk:onReceiveに時間がかかり過ぎると、onReceiveの時刻は次のようになります。28051 ms intent is:Intent {act = android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE flg = 0x4000010(補足あり)} ' **および** 'スキップされた38フレーム!アプリケーションがメインスレッドであまりにも多くの作業を行っている可能性があります。' – OmarGhb

+0

GaussianBlurがおそらく原因です。他には時間がかかりません。また、onReceive関数で発生している割り当てを移動します。 – Vasanth

+0

ありがとうございます。私はこれをしようとし、私は私のフィードバックを与えます。しかし、私はGaussianBlur関数ではないので、私はそれらのエラーがないので、GaussianBlurではないと確信しています。たぶん私はすべてのフレームで作業するのではなく、キャプチャ後にsignleイメージで処理する必要があります。 – OmarGhb

関連する問題