首页 > 编程知识 正文

树莓派opencv二维码,python扫描二维码输出内容

时间:2023-05-06 14:21:51 阅读:164961 作者:157

先源代码,github地址: https://github.com/derrick rose 25/opencv _ QR code _ recognition

环境: Pycharm、Python3.7

在pycharm上安装opencv-python、pyzbar软件包

简单的代码识别度很高,但直接使用库函数没有意义,但很实用:

import c v2 importpyzbar.pyzbaraspyzbardefdecodedisplay (image ) :barcodes=pyzbar.decode ) image forbarcodeinbarcode h )=barcode.rectcv2.rectangle ) image,) x,y ),x w,y h ),0,0,255 ), 2 ) #条形码数据是字节对象,首先,转换为字符串barcode data=barcode.data.decode (utf-8 ) ) barcodeType=barcode.type # ) ) )。)必须转换为barcodetype(cv2.puttext ) image,text,(x,y - 10 ),cv2.FONT_HERSHEY_SIMPLEX, 5, 2 )条形码数据和条形码类型print ([ info ] found { } barcode : { }.format (barcode type, barcodeData () return imagedef detect ) ) :camera=cv2.videocapture(0) # camera=cv2.video capture (' http://192.11192 ) 是读取当前的帧ret,frame=camera.read(#是灰度图像gray=cv2.cvtcolor ) frame,cv2.color _ bgr2gray (im=decodedisprate ) im ) ifcv2.waitkey(1)0xff==ord(q ) ) : break camera.release (cv2.destroyallwindows ) if__name_ )。 我听说过对图像进行滤波、开闭运算等一系列操作得到的二维码和条形码的位置,最后调用库进行了分析,定位采用的是OpenCV的传统算法。

import c v2 importnumpyasnpimportpyzbar.pyzbaraspyzbar #二维码定位global check #全局变量check是奇偶校验位defdetect(image ) : global check # 使用scharr操作(指定ksize=-1 )对图像进行Sobel运算(将图像从RGB转换为灰度gray=cv2.cvtcolor(image,cv2.COLOR_BGR2GRAY ) ) dx=1,dy=0,ksize=-1 ) #x方向通过从grady=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=x梯度减去y梯度获得轮廓。 此时处理噪音多的gradient=cv2.subtract(gradx,gradY ) #后,用convertScaleAbs )函数恢复原来的uint8形式。 否则不显示图像,在灰色窗口gradient=cv2.convertscaleabs (gradient ) cv2.imshow )、gradient )中用9x9的核平均模糊坡度图。 进行降噪255 (白色)或0 (黑色) blurred=cv2.blur ) gradient,)9) ) #低通滤波平滑图像ret,thresh=cv2.threshold )

RESH_BINARY) # 进行图像固定阈值二值化 # cv2.imshow("thresh",thresh) # 通过形态学操作,建立一个7*21的长方形内核,内核宽度大于长度,因此可以消除条形码中垂直条之间的缝隙 # 将建立的内核应用到二值图中,以此来消除竖杠间的缝隙 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7)) # 条形码 '''kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9)) #二维码''' # 对图像进行闭运算 closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # cv2.imshow("closed",closed) # 所得图像仍有许多白点,通过腐蚀和膨胀去除白点,最后一个参数是腐蚀的次数 closed = cv2.erode(closed, None, iterations=4) # cv2.imshow("closed1",closed) closed = cv2.dilate(closed, None, iterations=6) # cv2.imshow("closed2", closed) # 寻找轮廓 contours, hierarchy = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 如果没有找到,返回空9 if len(contours) == 0: check = False return None # e c = sorted(contours, key=cv2.contourArea, reverse=True)[0] rect = cv2.minAreaRect(c) # 生成最小外接矩形 # box为一个ndarry数组,返回4个顶点位置 box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(frame, [box], 0, (255, 0, 0), 2) # cv2.imshow("frame", frame) check = True return box# 二维码识别def scan(): box = detect(frame) # 调用detect()函数来查找二维码返回二维码的位置 # print(box) # 这下面的3步得到扫描区域,扫描区域要比检测出来的位置要大 if check == True: min = np.min(box, axis=0) max = np.max(box, axis=0) roi = frame[min[1] - 10:max[1] + 10, min[0] - 10:max[0] + 10] # 把区域里的二维码传换成RGB,并把它转换成pil里面的图像,因为zbar得调用pil里面的图像,而不能用opencv的图像 # roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB) # cv2.imshow("roi",roi) # print(roi.shape) if roi.any() != 0: barcodes = pyzbar.decode(roi) for barcode in barcodes: # 提取条形码的边界框的位置 # 画出图像中条形码的边界框 # (x, y, w, h) = barcode.rect # cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 0, 255), 2) # 条形码数据为字节对象,所以如果我们想在输出图像上 # 画出来,就需要先将它转换成字符串 barcodeData = barcode.data.decode("utf-8") barcodeType = barcode.type # 向终端打印条形码数据和条形码类型 print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData)) return roiif __name__ == '__main__': cameraCapture = cv2.VideoCapture(0) while True: # 获取当前帧 ret, frame = cameraCapture.read() scan() cv2.imshow("camera", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cameraCapture.release() cv2.destroyAllWindows() '''image = cv2.imread("Images/coke.jpg") detect(image) cv2.waitKey(0) cv2.destroyAllWindows()'''

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。