基于OpenCV的條形碼檢測
發布時間:2021-05-27 15:02:29
在日常生活中,經常會看到條形碼的應用,比如超市買東西的生活,圖書(shū)館借書(shū)的時候... ...
那麽這些東西是(shì)如何做到準确檢測出條形碼的位置呢?
這就是(shì)今天要介紹的内容了。
這篇文章的目标是(shì)演示使用計算機視覺和圖像處理技術實現(xiàn)條形碼的檢測。
通過本篇文章的學習,我們能學到的内容包括:
1、圖像處理中常用的一些操作流程,包括濾波、阈值化處理、膨脹、腐蝕和輪廓查找等
2、更重要的一點,希望通過這個案例,能夠幫助大家建立分析問題和處理問題的思路
需要注意的是(shì),這個算法并不适用于所有的條形碼,但(dàn)是(shì)它應該能給你一個基本的直覺,告訴你應該應用什麽類型的技術。
對于下面這個例子,我們将檢測下圖中的條形碼:
目标:
找到條形碼的位置,而去(qù)除掉幹擾的因素。
思路:
利用條形碼的自身特點,一般都是(shì)矩形形狀,而且條碼的條帶是(shì)黑色的,矩形區域是(shì)白色的。
首先,需要搭建好需要的開發環境,Opencv,Qt5.9或Vs2017。
接下來寫代碼:
首先将需要的頭文件添加到項目中,并将要識别的圖片路徑添加進來。
接下來進行實際的圖像處理:
首先我們先讀入圖片并将其轉換爲灰度圖;
然後我們使用Scharr操作符去(qù)構造圖片在水平和垂直方向上的梯度幅值表示。
這裏,我們用Scharr算子的x方向梯度減去(qù)y方向的梯度。通過這個相(xiàng)減操作,我們就隻剩下了高水平梯度和低垂直梯度的圖像區域。
我們上述原始圖像的梯度表示如下圖所示
請注意梯度操作是(shì)如何檢測出圖片的條形碼區域的。接下來的步驟是(shì)如何過濾掉圖片中的噪聲,重點關注條形碼區域。
我們做的第一件事是(shì)使用一個卷積核大小爲9x9的均值濾波作用于梯度圖片。對圖片進行這個操作将有助于平滑圖片中的高頻(pín)噪聲。
然後我将模糊化後的圖片進行阈值化,在梯度圖片中,所有的像素點的灰度值低于120的将設爲0(黑色),其餘設爲255(白色)。
模糊和阈值化處理後的輸出結果如下:
然而,正如你所看到的上圖阈值化圖片,在條形碼的垂直方向上存在這間隙。爲了縮小這些間隙,并使得我們的算法更加容易的檢測出條形碼的“斑點”狀區域,我們需要執行一些基礎的形态學操作:
我們通過使用函數cv2.getStructuringElement構造一個矩形核。這個核的寬度大于高度,因此允許我們縮小條形碼垂直條帶之間的間隙。
當然,現(xiàn)在圖片中非條形碼的區域存在着很多斑點,這将會幹擾輪廓的檢測。
現(xiàn)在,我們繼續嘗試移除這些小的斑點。
我們現(xiàn)在要做的是(shì)進行6次腐蝕操作,然後再進行6次膨脹操作。腐蝕操作将會“腐蝕”掉圖片中的白色像素點,因此将會清除這些小的斑點,而膨脹操作将會“擴張”剩餘的白色像素,并使白色區域變長。
如果在腐蝕過程中去(qù)除了小的斑點,則在膨脹的過程中不會再次出現(xiàn)。
在一系列的腐蝕和膨脹操作之後,這些小斑點已經被成功的移除了,隻剩下條形碼的區域。
最後尋找一下圖片中條形碼的區域的輪廓。
幸運的是(shì),OpenCV中提供了相(xiàng)應的接口,可以很容易地找到圖像中的最大輪廓,如果我們正确地完成了圖像處理步驟,它應該會對應于條形碼區域。
然後,我們确定最大輪廓的最小的邊界框,并最後顯示檢測到的條形碼。
正如我們下圖所示,我們已經成功的檢測到條形碼
這樣,條形碼的檢測就已經完成了!
想了解更多嵌入式知(zhī)識就來西安盛圖科技!