""" author: puhaiyang blog: https://blog.csdn.net/puhaiyang github: https://github.com/puhaiyang """ import math import cv2 from pyzbar import pyzbar import imutils def azimuthangle(x1, y1, x2, y2): """ 已知两点坐标计算角度 - :param x1: 原点横坐标值 :param y1: 原点纵坐标值 :param x2: 目标点横坐标值 :param y2: 目标纵坐标值 """ dx = x2 - x1 dy = y2 - y1 # 求斜率 k = dy / dx # 结果是弧度值 angle = math.atan(k) # 弧度值转为角度 return angle * 180 / math.pi def get_angle(qr_item): """ 获取出进行矫正所需要的角度 """ # 将坐标从下到上,从左到右进行排序 locs = {qr_item.polygon[0], qr_item.polygon[1], qr_item.polygon[2], qr_item.polygon[3]} locs = sorted(locs, key=lambda x: x.y * 100000 + x.x * 1000) return azimuthangle(locs[2].x, locs[2].y, locs[3].x, locs[3].y) def to_up_angle(qr_item): """ 获取出使二维码朝上的角度 """ if qr_item.orientation == 'UP': angle_ext = 0 elif qr_item.orientation == 'RIGHT': angle_ext = 270 elif qr_item.orientation == 'DOWN': angle_ext = 180 else: angle_ext = 90 return angle_ext def resize_img(ori_img): """ 图片压缩 """ height = ori_img.shape[0] width = ori_img.shape[1] # 执行压缩,按照500的宽度为标准 if width > 500: scale_percent = int(500 / width * 100) s_width = int(width * scale_percent / 100) s_height = int(height * scale_percent / 100) # 新的宽度和高度 dim = (s_width, s_height) return cv2.resize(ori_img, dim, interpolation=cv2.INTER_AREA) else: return ori_img def adjust_rotae_angle(img): angle = 0 # 对图片进行压缩 img = resize_img(img) # symbol为64代表二维码 qr_result = pyzbar.decode(img, symbols=[64]) if len(qr_result) == 1: # 识别到了一个二维码,将二维码朝上旋转 first_adjust_angle = to_up_angle(qr_result[0]) # 进行旋转 img_rotae_to_up = imutils.rotate_bound(img, first_adjust_angle) # 再次识别 qr_result2 = pyzbar.decode(img_rotae_to_up, symbols=[64]) if len(qr_result2) == 1: last_adjust_angle = -get_angle(qr_result2[0]) angle = first_adjust_angle + last_adjust_angle print("first angle:%d last angle:%d angle:%d" % (first_adjust_angle, last_adjust_angle, angle)) else: print('last 未识别到二维码') else: print('first 未识别到二维码') return angle if __name__ == '__main__': # 加载图片 img = cv2.imread('123.jpg') adjust_angle = adjust_rotae_angle(img.copy()) if adjust_angle != 0: img_rotae = imutils.rotate_bound(img, adjust_angle) cv2.imwrite('img_rotae.jpg', img_rotae)