1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用python和opencv檢測(cè)圖像中的條形碼

        共 4199字,需瀏覽 9分鐘

         ·

        2021-09-03 14:52

        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        在學(xué)習(xí)中發(fā)現(xiàn)快樂,在應(yīng)用找到價(jià)值。這是我第五期分享圖像技術(shù)應(yīng)用的文章。

        前四期歡迎閱讀和分享:


        概述


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

        那么這些東西是如何做到準(zhǔn)確檢測(cè)出條形碼的位置呢?

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

        這篇博文的目標(biāo)是演示使用計(jì)算機(jī)視覺和圖像處理技術(shù)實(shí)現(xiàn)條形碼的檢測(cè)。

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

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

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

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



        條形碼的檢測(cè)


        對(duì)于下面這個(gè)例子,我們將檢測(cè)下圖中的條形碼:



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


        思路:

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


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

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

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

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

        現(xiàn)在,讓我進(jìn)行實(shí)際的圖像處理吧 導(dǎo)入圖片并轉(zhuǎn)化為灰度圖

        image = cv2.imread(args["image"])gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 計(jì)算圖片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)


        首先我們先讀入圖片并將其轉(zhuǎn)換為灰度圖;

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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


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

        # 找到閾值化后圖片中的輪廓,然后進(jìn)行根據(jù)區(qū)域進(jìn)行排序,僅保留最大區(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]
        # 計(jì)算最大輪廓的旋轉(zhuǎn)邊界框rect = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)box = np.int0(box)
        # 在檢測(cè)到的條形碼周圍繪制邊界框并顯示圖片cv2.drawContours(image, [box], -1, (0,255,0), 3)cv2.imshow("Image", image)cv2.waitKey(0)

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

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

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

        詳細(xì)代碼鏈接: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

        另外還提供了其他的測(cè)試圖片


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


        總結(jié)


        值得去思考的點(diǎn)

        1、為啥要轉(zhuǎn)變成灰度圖

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


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

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

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


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


        瀏覽 77
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲电影一级片 | 少妇高潮heyzo | 爱爱电影无码 | 国产淫乱一级精品录像 | 天美传媒操逼视频 | 青青草综合视频 | 久久久久草 | 韩国下部无遮挡 | 国产精品大屁股白浆免费A片 | 日本夫妻性生活视频 |