二维码(QR码)
概念: 二维码是一种矩阵式的二维条码,由黑白方块组成,可以存储大量的信息,包括文本、链接、数字等。QR码的编码方式是在矩阵中通过不同的黑白方块组合表示不同的信息。
特点:
二维码可以存储更多的信息,适用于多种应用场景。
由于采用矩阵结构,二维码的容错性较高,即使部分损坏,仍然能够被正确识别。
OpenCV中的支持: 在OpenCV中,使用 cv2.QRCodeDetector 类可以方便地检测和解码二维码。
条形码
概念: 条形码是一种线性的、一维的编码方式,通过在一条平行线上的不同宽度的条和间隙的组合来表示信息。不同的编码规则(如Code-128、EAN-13等)决定了不同的条形码标准。
特点:
条形码通常只能存储较少的信息,主要用于标识商品、库存等。
条形码的读取速度较快,适用于快速的扫描场景。
OpenCV中的支持: 在OpenCV中,使用 cv2.BarcodeDetector 类可以方便地检测和解码多种条形码类型。
cv.barcode.BarcodeDetector.detectAndDecodeWithType( img[, points] ) -> retval, decoded_info, decoded_type, points
参数解释:
retval 如果至少找到一个有效的条形码,则为 true img 包含条形码的灰度或彩色 (BGR) 图像。 decoded_info 字符串的 UTF8 编码输出向量或字符串的空向量(如果代码无法解码)。 decoded_type 字符串向量,指定这些条形码的类型 points 找到的条形码矩形的顶点的可选输出向量。如果未找到,则为空。
cv.GraphicalCodeDetector.detectAndDecode( img[, points[, straight_code]] ) -> retval, points, straight_code
参数解释:
img 包含图形代码的灰度或彩色 (BGR) 图像。 decoded_info UTF8 编码的字符串输出向量或字符串的空向量(如果代码无法解码)。 points 找到的图形代码四边形的顶点的可选输出向量。如果未找到,则为空。 straight_code 包含二值化代码的可选图像向量
cv提供的检测方法可能较多适用于固定图片输入进行检测,但是对于大多数场景下都是摄像头进行实时检测,这里我另外展示 pyzbar检测二维码,在pyzbar中实时检测的效果也没有想象中的好,灯光,二维码位置很大程度上影响了识别效果。
import numpy as np
import cv2
def QR_DetectAndDecode(img):
detector = cv2.QRCodeDetector()
data, point, outimg = detector.detectAndDecode(img)
cv2.drawContours(img, [np.int32(point)], 0, (0, 0, 255), 3)
cv2.putText(img,data,((np.int32(point)[0][0])[0]-200,(np.int32(point)[0][0]+30)[1]-100),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),3)
return img
def Barcode_DetectAndDecode(img):
detector = cv2.barcode.BarcodeDetector()
result, decoded_info, decoded_type, point = detector.detectAndDecodeWithType(img)
print(result)
cv2.drawContours(img, [np.int32(point)], 0, (0, 0, 255), 3)
cv2.putText(img,decoded_info[0]+' Type:'+decoded_type[0],((np.int32(point)[0][0])[0]-150,(np.int32(point)[0][0]+30)[1]-100),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),3)
return img
if __name__ in '__main__':
path = 'barcode.jpg'
img = cv2.imread(path)
img = cv2.resize(img, (1024,1024))
img = Barcode_DetectAndDecode(img)
cv2.imshow('pic', img)
cv2.waitKey(0)
import cv2
import pyzbar.pyzbar as pyzbar
def decodeImg(image):
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
barcodes = pyzbar.decode(gray)
for barcode in barcodes:
(x,y,w,h) = barcode.rect
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
barcodeData = barcode.data.decode('utf-8')
barcodeType = barcode.type
text = '{} ({})'.format(barcodeData,barcodeType)
cv2.putText(image,text,(x-100,y-10),cv2.FONT_HERSHEY_SIMPLEX,.5,(0,0,125),2)
return image
def detect():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print('error')
while True:
ret, img = cap.read()
im = decodeImg(img)
cv2.imshow('img',im)
if cv2.waitKey(1) &0xff == ord('q'):
break
cv2.destroyAllWindows()
if __name__ == "__main__":
detect()
本次实验主要展示了cv包中的二维码和条形码检测,对于固定拍摄的图片检测效果还是较为理想,但是通过摄像头定时摄取的效果效果不理想,主要是通过用这种方法如果没有及时有二维码或条形码出现容易直接报错阻塞。
如有错误或遗漏,希望小伙伴批评指正!!!!
希望这篇博客对你有帮助!!!!
Opencv实验合集——实验六:模板匹配-CSDN博客