2014-12-21 19 views
1

我想我現在用的是梯度法使用OpenCV的檢測從圖像條碼, :http://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/ 從以下問題的幫助:How to find the location of red region in an image using MATLAB?opencv的C++閾值不工作,條形碼檢測

代碼:

Mat imgco,img,imgx,imgy,thresh; 
imgco = imread("/Users/a/Desktop/barcode_01.jpg"); 

//### Convert image to grayscale ### 
cvtColor(imgco,img,CV_BGR2GRAY); 
imshow("img", img); 
waitKey(0); 

//### Finding horizontal and vertical gradient ### 

Sobel(img,imgx,CV_16S,1,0,-1,50,0,BORDER_DEFAULT); 
imgx = abs(imgx); 
imshow("img", imgx); 
waitKey(0); 

Sobel(img,imgy,CV_16S,0,1,-1,50,0,BORDER_DEFAULT); 
imgy = abs(imgy); 
imshow("img", imgy); 
waitKey(0); 

absdiff(imgx, imgy, img); 
imshow("img", img); 
waitKey(0); 

//### Low pass filtering ### 
GaussianBlur(img, img, Size(9,9), 0); 
imshow("img", img); 
waitKey(0); 

//### Applying Threshold ### 
threshold(img,thresh,225,255,CV_THRESH_BINARY); 
imshow("img", thresh); 
waitKey(0); 

現在程序工作正常upto高斯模糊,不知怎的試圖閾值圖像給出一個空白輸出。任何人都可以建議可能是什麼問題?

Gaussian Output: Threshold Output:

謝謝。

更新:在AbsDiff之前應用閾值操作,結果正確地閾值化。因此,有一些與使用AbsDiff有關的東西,那就是與閾值混淆。任何幫助?

更新2:將我的輸出與以下內容進行比較:http://www.pyimagesearch.com/wp-content/uploads/2014/11/barcode_gradient_and_detection.jpg我意識到在作者獲得清晰的黑色空白時,我正在顯示灰色圖像?即使我們正在執行相同的操作。謝謝。

+1

您的sobel操作會生成16位圖像,而閾值中的值爲8位 – berak

+0

您可以添加* original *圖像(不帶任何過濾)嗎? – berak

+0

你好,是的。原始圖片:http://www.pyimagesearch.com/wp-content/uploads/2014/11/barcode_01.jpg 我試圖將它縮放到8位: img.convertTo(img,CV_8U,0.00390625); 仍然閾值給出相同的輸出。 –

回答

0

好的解決方案:

1)不需要在梯度運算中使用縮放。

2)使用convertScaleAbs方法將圖像轉換爲8位是必要的。

img.convertTo(img, CV_8U, 0.00390625); 

不起作用。解決問題! :)由pyimage的作者幫助!