python+opencv檢測圖片中二維碼
緣起
需要檢測發票中二維碼的位置,以確定影像該怎麼旋轉,同時也可以為提取二維碼資訊創造先覺條件!(萬惡的需求!)
失敗的嘗試--opencv訓練大法
不感興趣的可跳過不看!
- 參考原文:https://blog.csdn.net/qq_27063119/article/details/79247266
- 解釋:原文作者是訓練檢測舌頭。。(蜜汁尷尬),先通過opencv自帶的人臉檢測cascade分類器進行人臉檢測然後疊加訓練的舌頭分類器完成舌頭的檢測任務。不多說。
- 我的實踐:按照原作者的方法,換個資料集我來嘗試一下。
-
正樣本:一波處理操作後得到以下樣本
-
負樣本:一波騷操作後得到以下樣本
-
訓練資料夾結構
-
測試效果
- 解釋:我解釋為訓練樣本太少,正樣本少,負樣本也少,原作者說負樣本的數量要多於正樣本很大一部分,然而我的負樣本確實比較少,但我按照模式識別的思想去思考一波,感覺這非常勉強。。。
成功的嘗試!
第一步:靈感的來源
- 原文連結:https://www.jianshu.com/p/604774f7edb5
- 關鍵
原作者給出了這麼個樣式,想一想很明顯可以遷移學習的。點開之!
連結:http://blog.jobbole.com/80448/
第二步:消化以上實現效果的方法
經過一番瀏覽以後,作者自己就給出了總體的實現思路,如下:
- 計算x方向和y方向上的Scharr梯度幅值表示
- 將x-gradient減去y-gradient來顯示條形碼區域
- 模糊並二值化影像
- 對二值化影像應用閉運算核心
- 進行系列的腐蝕、膨脹
-
找到影像中的最大輪廓,大概便是條形碼
作者最後的實現效果:
可以看出,思路異常清晰!效果也不錯,適合自己的需求。
第三步:觀察自己的圖片
簡單處理後是這樣的
- 分析:要識別二維碼,這個圖片當中顏色區分很明顯,所以首先需要把藍色以外的其他色調給去掉!
第四步:寫個小指令碼僅顯示藍色調
直接上程式碼:OnlyBlue.py
import numpy as np
import cv2
import argparse
# 藍色的範圍,不同光照條件下不一樣,可靈活調整
lower_blue = np.array([90, 90, 90])
upper_blue = np.array([130, 255, 255])
ap=argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "path to the image file")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
hsv=cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 3.inRange():介於lower/upper之間的為白色,其餘黑色
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 4.只保留原圖中的藍色部分
res = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('image', image)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.imwrite('blue.jpg',res)
cv2.waitKey(0)
以上程式碼參考自:傳送門
也是很好的一篇部落格,感興趣的可以看看
- 解釋:由於我這裡是比較淺的藍色調,因此更改了原來程式碼當中的上下閾值定義部分,如下:
# 藍色的範圍,不同光照條件下不一樣,可靈活調整
lower_blue = np.array([90, 90, 90])
upper_blue = np.array([130, 255, 255])
-
效果
這效果我感覺後面已經可以處理了,遂沒有再去調閾值引數。
第五步:寫檢測二維碼的程式指令碼
直接上程式碼:
import numpy as np
import argparse
import cv2
ap=argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "path to the image file")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gradX = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1)
gradY = cv2.Sobel(gray, ddepth = cv2.CV_32F, dx = 0, dy = 1, ksize = -1)
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imshow("gradient",gradient)
#原本沒有過濾顏色通道的時候,這個高斯模糊有效,但是如果進行了顏色過濾,不用高斯模糊效果更好
#blurred = cv2.blur(gradient, (9, 9))
(_, thresh) = cv2.threshold(gradient, 225, 255, cv2.THRESH_BINARY)
cv2.imshow("thresh",thresh)
cv2.imwrite('thresh.jpg',thresh)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 21))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
cv2.imshow("closed",closed)
cv2.imwrite('closed.jpg',closed)
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)
cv2.imwrite('closed1.jpg',closed)
img,cnts, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))
cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imwrite("final.jpg",image)
cv2.imshow("Image", image)
cv2.waitKey(0)
關鍵錯誤bug解決
原作者文中的程式碼執行起來有些問題,主要以下兩個
- 關於 Python opencv 使用中的 ValueError: too many values to unpack
- Why can't use
cv2.cv.BoxPoints
in OpenCV (Python)? - 解決連結:傳送門
-
關鍵部分
第六步:測試效果
效果很成功!
相關文章
- 目標檢測:二維碼檢測方案
- 十行Python程式碼搞定圖片中的物體檢測Python
- python+opencv邊緣檢測方法整理PythonOpenCV
- [譯] 提取圖片中的文字、人臉或者條形碼 —— 形狀檢測APIAPI
- yolov5實戰之二維碼檢測YOLO
- php生成二維碼圖片PHP
- url 生成二維碼圖片
- 影象二值化(python+opencv)PythonOpenCV
- 圖片人臉檢測——OpenCV版(二)OpenCV
- Python+OpenCV目標跟蹤實現基本的運動檢測PythonOpenCV
- UOJ #889. 【UNR #8】二維抄襲檢測
- 「乾貨」檢測識別二維碼的幾大開源庫彙總
- 二維碼管理平臺 生成二維碼
- canvas實現二維碼和圖片合成Canvas
- 基於ZXingAndroid實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- 二維碼
- Flutter - 生成二維碼與識別二維碼Flutter
- 基於ZXing Android實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- 在JPEG圖片中嵌入HTMLHTML
- 直播平臺原始碼,vue圖片中劃框擷取部分圖片原始碼Vue
- 設定二維碼圖片背景透明教程
- 直播系統搭建,java二維碼 生成二維碼Java
- 二維碼生成
- 二維碼解析
- 聊聊二維碼
- 人臉檢測 二
- 漏洞檢測方法如何選?詳解原始碼與二進位制SCA檢測原理原始碼
- 帶動態背景圖的二維碼生成器
- Android 二維碼相關(二)Android
- 微信小程式:小程式碼、小程式二維碼、普通二維碼微信小程式
- QR Code二維碼
- 二維碼知識
- 二維碼生成-PythonPython
- 趣味二維碼生成
- Canvas 縮放圖片中細節消失Canvas
- 提取圖片中文字的教程
- 從普通二維碼到檔案生成二維碼的轉變
- 生成帶二維碼圖片並通過微信分享