iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python OpenCV实现任意角度二维码矫正
  • 525
分享到

Python OpenCV实现任意角度二维码矫正

2024-04-02 19:04:59 525人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一般图片矫正方式二维码图片矫正思路编码实现前言 那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心

前言

那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈

不得不说好奇心是个很神奇的东西,就把我给吸引过去了

我定眼一看,感觉作为JAVA开发的我自己也能进行处理

因为看到了图片后,发现了图片中一个很重要的特征点:

要进行矫正的图片中都会有一个二维码图案,想要矫正的文字和二维码图案是处于同一水平线的。

如下面这个

要把图片中的“水中加点糖”四个字矫正,只需要把二维码矫正就可以了。

具体想法就是,求得二维码矫正的角度a,对原图整体按照角度a进行旋转就可以了。

有了想法后,就趁热打铁,正好周末了在家试试。

一般图片矫正方式

对于一般的图片矫正,最常见的做法有这么两种:

对图片进行预处理获取出轮廓,并求得轮廓的近似矩形,通过矩形的定位点来进行透视变换

对图片进行预处理后,进行霍夫变换进行直线检测,再根据直线的倾斜角进行旋转

但是对于图片中有二维码的图片进行矫正就可以更加简单了,因为二维码中有定位点并且成熟框架很多,实现起来也更加方便且识别率非常高。

二维码图片矫正

思路

识别出二维码的角点,通过相邻两个角点的坐标计算出夹角度数,再次用此度数对图片进行旋转。

以下面图为例:

先获取出二维码正方向时底部的两点坐标,并求得两点的倾斜角。

斜率计算用初中数学中求两点坐标斜率的公式算一下即可,忘了就搜搜回忆一下:

两点的斜率公式:k=(y1-y2)/(x1-x2),x1≠x2。其中(x1,y1),(x2,y2)是已知两点的坐标,x1≠x2。

斜率是表示一条直线(或曲线的切线)关于(横)坐标轴倾斜程度的量。它通常用直线(或曲线的切线)与(横)坐标轴夹角的正切,或两点的纵坐标之差与横坐标之差的比来表示。记作k,k=tgα。

一条直线与某平面直角坐标系横坐标轴正半轴方向所成的角的正切值即该直线相对于该坐标系的斜率。如果直线与x轴互相垂直,直角的正切值为tan90°,故此直线不存在斜率(也可以说直线的斜率为无穷大)。当直线L的斜率存在时,对于一次函数y=kx+b(斜截式),k即该函数图像的斜率。

编码实现

实现时对于二维码的识别用到了pyzbar库,对图片处理用的OpenCV

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

最终输出的图片结果:

矫正成功!

需要说明的是,上面之所以要进行对图片的resize,是因为图片太大的话pyzbar可能会识别不出来二维码

到此这篇关于python OpenCV实现任意角度二维码矫正的文章就介绍到这了,更多相关Python OpenCV二维码矫正内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python OpenCV实现任意角度二维码矫正

本文链接: https://www.lsjlt.com/news/118443.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python OpenCV实现任意角度二维码矫正
    目录前言一般图片矫正方式二维码图片矫正思路编码实现前言 那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心...
    99+
    2022-11-11
  • OpenCV实现绕图片中任意角度旋转任意角度
    最近在做项目需要把把图片绕图片中任意点旋转任意角度,考虑到自己旋转需要编写插值算法,所以想到了用opencv,但是网上都是围绕图片中点旋转任意角度的,都是向下面这样写的: 绕图片中心...
    99+
    2022-11-13
  • opencv图片的任意角度旋转实现示例
    目录一 旋转角度坐标的计算二 旋转任意角度的步骤三 实现一 旋转角度坐标的计算 1.如果O点为圆心,则点P绕点O旋转redian弧度之后,点P的坐标变换为点Q的计算公式为: Q.x=...
    99+
    2022-11-12
  • Python+OpenCV实现角度测量的示例代码
    本文介绍如何使用python语言实现角度测量,程序包括鼠标选点、直线斜率计算、角度计算三个子程序和一个主程序。最终实现效果:在图片上用鼠标确认三点,程序将会显示由此三点确定的角度,如...
    99+
    2022-11-13
  • 从Python打包程序的角度看二维码编程算法的实现技巧
    二维码是一种常见的编码方式,它可以将大量的数据压缩到一个小小的图案中,方便我们进行数据传输和存储。在现实生活中,我们可以在各种场景中看到二维码的身影,例如扫码支付、二维码门禁等等。那么,如何通过Python实现二维码编程算法呢?本文将从P...
    99+
    2023-08-26
    打包 编程算法 二维码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作