103 lines
2.9 KiB
Python
103 lines
2.9 KiB
Python
|
"""
|
||
|
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)
|