2016-07-03 34 views
1

我使用覆盆子PI相機從圖像讀取條形碼,並且對象需要從相機在我的應用相對較遠是。處理前的條形碼:Before條碼預處理爲zbar和

Zbar無法解碼此圖像中的任何內容,因此我決定嘗試手動編輯圖像以使其解碼。在條形碼的單行之間繪製清晰的白線並更改圖像的對比度後,此結果由ZBar解碼:After

如何以編程方式從第一個圖像轉到第二個圖像(我正在使用OpenCV與Python現在)?

+0

看起來你需要條碼的更詳細的圖片(更好的聚焦?) - 更多的像素 - 選擇更高分辨率的照相機,變焦鏡頭,移動條碼更接近相機,更大的條形碼... – barny

回答

1

的問題是很簡單考慮到最暗的區域是黑色的,不需要任何灰色區域轉換爲白色。嘗試計算圖像的平均強度。

CV ::標量avgPixelIntensity = CV ::平均值(圖像);

使用此值作爲閾值,您可以執行圖像閾值。這將是相當快的。

您也可以嘗試Otsu閾值是自適應閾值技術。這將比上述方法慢,但在圖像具有其他人工製品(如陰影)的情況下會提供更好的結果。

在這裏看到:Image Thresholding Opencv

+0

The問題是平均值可能不會是正確的閾值,因爲圖像不是半像素黑和半像素白。此外,實際放大時,組成垂直線的灰色像素與「白色」像素之間的差異實際上非常小,因此即使稍微不正確的閾值也會產生嚴重的影響 – glaba

+0

@glaba您是否可以將圖片發送到平均作爲一個門檻不會工作?其次,你有沒有機會檢查OTSU。我建議OTSU在OCR應用中完全用於此目的。如果兩者都不起作用,使用邊緣檢測與Hough Line Detector配對將會得到所有線條,但是然後讀取文本字符將會是一個尚未解決的問題。附: OTSU應該在本地計算閾值參數時工作,所以它會在灰線和白色背景之間產生差異。如果你沒有使用足夠小的窗口,它不會考慮非常黑的線條。 – saurabheights

+0

@glaba錯字:最後一行應該說:「那如果你使用的是足夠小窗口不會考慮很黑線: – saurabheights

1

嘗試對其進行閾值處理。

首先將其轉換爲灰度圖像,然後通過試驗和錯誤嘗試獲取0-255之間的最佳值,並選擇標記爲白色,均低於黑色值之上的所有像素。

如果它不起作用,那麼輸入圖像需要更清晰。

(不知道,如果zbar和庫已經這樣做了)