103 lines
2.9 KiB
Python
Raw Permalink Normal View History

"""
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)