<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于OpenCV的條形碼檢測

          共 4159字,需瀏覽 9分鐘

           ·

          2021-01-15 17:29

          點擊上方小白學視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達

          推薦閱讀

          42個pycharm使用技巧,瞬間從黑鐵變王者

          Google C++項目編程風格指南 (中文版) 分享


          概述


          在日常生活中,經(jīng)常會看到條形碼的應用,比如超市買東西的生活,圖書館借書的時候。。。

          那么這些東西是如何做到準確檢測出條形碼的位置呢?

          這就是今天要介紹的內(nèi)容了

          這篇博文的目標是演示使用計算機視覺和圖像處理技術實現(xiàn)條形碼的檢測。

          通過本篇文章的學習,我們能學到的內(nèi)容包括:

          1、圖像處理中常用的一些操作流程,包括濾波、閾值化處理、膨脹、腐蝕和輪廓查找等

          2、更重要的一點,希望通過這個案例,能夠幫助大家建立分析問題和處理問題的思路

          需要注意的是,這個算法并不適用于所有的條形碼,但是它應該能給你一個基本的直覺,告訴你應該應用什么類型的技術。



          ?

          條形碼的檢測


          對于下面這個例子,我們將檢測下圖中的條形碼:


          目標:找到條形碼的位置,而去除掉干擾的因素


          思路:

          利用條形碼的自身特點,一般都是矩形形狀,而且條碼的條帶是黑色的,矩形區(qū)域是白色的



          讓我們繼續(xù)寫一些代碼。打開一個新文件,將其命名為 detect_barcode.py,如何開始寫代碼:

          # 導入必要的包/庫import numpy as npimport argparseimport imutilsimport cv2
          # 構造參數(shù)解析并分析參數(shù)ap = argparse.ArgumentParser()ap.add_argument("-i","--image", required = True, help = "path to the image file")args = vars(ap.parse_args())

          我們首先要做的是導入我們需要的包。我們將使用numpy進行數(shù)字處理,argparse用于解析命令行參數(shù),cv2進行opencv綁定。

          然后我們將設置命令行參數(shù)。我們這里只需要一個開關,即 --image,它是我們圖像的路徑,其中包含我們想要檢測的條形碼。

          現(xiàn)在,讓我進行實際的圖像處理吧 導入圖片并轉化為灰度圖

          image = cv2.imread(args["image"])gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
          # 計算圖片x和y方向的Scharr梯度大小ddepth = cv2.cv.CV_32F if imutils.is_cv2() else cv2.CV_32FgradX = cv2.Sobel(gray, ddepth=ddepth , dx=1, dy=0, ksize=-1)gradY = cv2.Sobel(gray, ddepth=ddepth , dx=0, dy=1, ksize=-1)
          # 用x方向的梯度減去y方向的梯度gradient = cv2.subtract(gradX,gradY)gradient?=?cv2.convertScaleAbs(gradient)


          首先我們先讀入圖片并將其轉換為灰度圖;

          然后我們使用Scharr操作符(這里制定ksize=1)去構造圖片在水平和垂直方向上的梯度幅值表示。

          這里,我們用Scharr算子的x方向梯度減去y方向的梯度。通過這個相減操作,我們就只剩下了高水平梯度和低垂直梯度的圖像區(qū)域。

          我們上述原始圖像的梯度表示如下圖所示

          請注意梯度操作是如何檢測出圖片的條形碼區(qū)域的。接下來的步驟是如何過濾掉圖片中的噪聲,重點關注條形碼區(qū)域。

          # 對圖片進行模糊和閾值化操作blurred = cv2.blur(gradient,(9,9))(_,thresh) = cv2.threshold(blurred, 255, 255, cv2.THRESH_BINARY)

          我們做的第一件事是使用一個卷積核大小為9x9的均值濾波作用于梯度圖片。對圖片進行這個操作將有助于平滑圖片中的高頻噪聲。

          然后我將模糊化后的圖片進行閾值化,在梯度圖片中,所有的像素點的灰度值低于255的將設為0(黑色),其余設為255(白色)。

          模糊和閾值化處理后的輸出結果如下:

          然而,正如你所看到的上圖閾值化圖片,在條形碼的垂直方向上存在這間隙。為了縮小這些間隙,并使得我們的算法更加容易的檢測出條形碼的“斑點”狀區(qū)域,我們需要執(zhí)行一些基礎的形態(tài)學操作:

          # 構造一個閉合核并應用于閾值圖片kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)


          我們通過使用函數(shù)cv2.getStructuringElement構造一個矩形核。這個核的寬度大于高度,因此允許我們縮小條形碼垂直條帶之間的間隙。

          當然,現(xiàn)在圖片中非條形碼的區(qū)域存在著很多斑點,這將會干擾輪廓的檢測。

          現(xiàn)在,我們繼續(xù)嘗試移除這些小的斑點

          # 執(zhí)行一系列的腐蝕和膨脹操作closed = cv2.erode(closed, None, iterations = 4)closed = cv2.dilate(closed, None, iterations = 4)


          我們現(xiàn)在要做的是進行4次腐蝕操作,然后再進行4次膨脹操作。腐蝕操作將會“腐蝕”掉圖片中的白色像素點,因此將會清除這些小的斑點,而膨脹操作將會“擴張”剩余的白色像素,并使白色區(qū)域變長。

          如果在腐蝕過程中去除了小的斑點,則在膨脹的過程中不會再次出現(xiàn)。

          在一系列的腐蝕和膨脹操作之后,這些小斑點已經(jīng)被成功的移除了,只剩下條形碼的區(qū)域。


          最后尋找一下圖片中條形碼的區(qū)域的輪廓。

          # 找到閾值化后圖片中的輪廓,然后進行根據(jù)區(qū)域進行排序,僅保留最大區(qū)域cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
          # 計算最大輪廓的旋轉邊界框rect = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)box = np.int0(box)
          # 在檢測到的條形碼周圍繪制邊界框并顯示圖片cv2.drawContours(image, [box], -1, (0,255,0), 3)cv2.imshow("Image", image)cv2.waitKey(0)

          幸運的是,opencv中提供了相應的接口,可以很容易地找到圖像中的最大輪廓,如果我們正確地完成了圖像處理步驟,它應該會對應于條形碼區(qū)域。

          然后,我們確定最大輪廓的最小的邊界框,并最后顯示檢測到的條形碼。

          正如我們下圖所示,我們已經(jīng)成功的檢測到條形碼

          代碼鏈接:https://github.com/DWCTOD/AI_study/tree/master/%E5%90%88%E6%A0%BC%E7%9A%84CV%E5%B7%A5%E7%A8%8B%E5%B8%88/%E5%AE%9E%E6%88%98%E7%AF%87/opencv/%EF%BC%88%E4%BA%94%EF%BC%89%E7%94%A8python%E5%92%8Copencv%E6%A3%80%E6%B5%8B%E5%9B%BE%E5%83%8F%E4%B8%AD%E7%9A%84%E6%9D%A1%E5%BD%A2%E7%A0%81


          使用方法:python3 detect_barcode.py --image images/barcode_01.jpg

          另外還提供了其他的測試圖片


          英文原文鏈接:https://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/


          ?

          總結


          值得去思考的點

          1、為啥要轉變成灰度圖

          2、如何去除干擾因素,特別是條形碼下面的材料說明的區(qū)域是采用什么辦法去除的,小的斑點是如何去除的


          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學視覺」公眾號后臺回復:擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目31講
          小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目31講即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

          下載4:leetcode算法開源書
          小白學視覺公眾號后臺回復:leetcode即可下載。每題都 runtime beats 100% 的開源好書,你值得擁有!





          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰免费人妻 | 做爱www| 无码一区一区 | 青娱乐青青草在线观看 | 国产区视频在线播放 |