2016-07-03 31 views
1

私はラズベリーパイカメラを使用して画像からバーコードを読み取っています。そのオブジェクトはアプリケーションでカメラから比較的離れている必要があります。処理前のバーコード:Beforezbarのバーコード前処理

Zbarはこの画像から何もデコードできませんでした。私は手動で画像を編集してデコードすることにしました。 After

プログラムで最初のイメージから2番目のイメージに移動するにはどうすればよいですか(OpenCVを使用していますか?今はPythonで)?

+0

バーコードの詳細な写真(より焦点を合わせたもの)が必要なように見えます - より多くのピクセル - 選択肢は高解像度カメラ、ズームレンズ、バーコードをカメラに近づけ、バーコードを大きくします... – barny

答えて

1

問題は最も暗い領域は黒であり、任意の灰色がかった領域が白に変換する必要が考える非常に簡単です(zbarライブラリはすでにこれをしなければわかりません)。イメージの平均強度を計算してみてください。

cv :: Scalar avgPixelIntensity = cv :: mean(image);

この値をしきい値として使用すると、イメージのしきい値を設定できます。これはかなり速いでしょう。

また、適応型しきい値処理手法である大津閾値処理を試すこともできます。これは、上記の方法よりも遅くなりますが、画像に影などの他のアーティファクトがある場合に、より良い結果が得られます。

ここをクリックしてください:Image Thresholding Opencv

+0

問題は、画像が半画素黒でなく、半画素白でないため、平均が正しい閾値ではない可能性が高いことである。また、実際にズームインすると、縦線を構成する灰色のピクセルと「白い」ピクセルの間の差は実際にはかなり小さいので、少し誤ったしきい値でさえも大きな影響があります – glaba

+0

@glaba画像を投稿できますか?閾値としての平均は機能しませんか?第二に、あなたはOTSUをチェックする機会を得ましたか?私は、OCRアプリケーションでこの目的のために使用されているので、OTSUを推奨しました。両方とも動作しない場合、エッジ検出をハフライン検出器と組み合わせて使用​​するとすべての行が得られますが、テキスト文字を読み取ることは未解決の問題です。 P.S. OTSUは、しきい値パラメータをローカルで計算するので、灰色の線とその白い背景との間に差が生じるように機能するはずです。あなたが十分に小さい窓を使用していないなら、非常に黒い線を考慮しません。 – saurabheights

+0

@glaba Typo:最後の行は、 "十分に小さなウィンドウを使用している場合、非常に黒い線を考慮しないでください。: – saurabheights

1

お試しください。

最初にグレースケールに変換してから試行錯誤して、0-255の間で可能な限り最良の値を得ようとすると、白く選択された値の上にあるすべてのピクセルを黒色にします。

これが機能しない場合は、入力イメージの明瞭性が必要です。