opencv快速实现任意角度二维码矫正

这篇具有很好参考价值的文章主要介绍了opencv快速实现任意角度二维码矫正。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

如下面这个

opencv快速实现任意角度二维码矫正
要把图片中的“水中加点糖”四个字矫正,只需要把二维码矫正就可以了。

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

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

一般图片矫正方式

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

  • 对图片进行预处理获取出轮廓,并求得轮廓的近似矩形,通过矩形的定位点来进行透视变换
  • 对图片进行预处理后,进行霍夫变换进行直线检测,再根据直线的倾斜角进行旋转

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

二维码图片矫正

思路

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

以下面图为例:
opencv快速实现任意角度二维码矫正

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

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

两点的斜率公式: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)

最终输出的图片结果:
opencv快速实现任意角度二维码矫正
矫正成功!

需要说明的是,上面之所以要进行对图片的resize,是因为图片太大的话pyzbar可能会识别不出来二维码文章来源地址https://www.toymoban.com/news/detail-449858.html

到了这里,关于opencv快速实现任意角度二维码矫正的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字图像处理二维码识别python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码; (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维码实时检测和识别 代码保证原创、无错误、能正常运行(如果电脑环境配置没问题) 送二维

    2024年01月16日
    浏览(63)
  • 利用opencv实现二维码检测(简单易上手)

    二维码检测是一个简单易上手的小项目,掌握opencv基础的语句就可以实现。解析二维码的过程有专门的库来实现,所以只需调相应的库就好了。在实现这个代码前,先要配置opencv环境。 Python与Opencv配置安装_哔哩哔哩_bilibili 这里用anaconda配置很方便 摄像头帧画面的提取:调用

    2024年02月04日
    浏览(40)
  • opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

    废话不多说,直接上代码 运行效果: 会在当前目前生成一张图片 对生成的二维码识别 opencv从4代之后推出了二维码识别接口.调用方法是这样的.代码如下: 运行结果: 返回值有三个, 第一个result就是解码后的内容,例如我这个二维码的结果是\\\"B0018\\\",当然也可以是个纯数字. 第二

    2024年02月11日
    浏览(43)
  • 微信小程序任意指定页面生成二维码

    在日常微信小程序运营中,文章,和朋友圈海报内总会用到微信小程序特定页面二维码 ps:一定要输入当前小程序小程序项目成员的微信号

    2024年02月11日
    浏览(55)
  • 计算机竞赛 python+opencv+深度学习实现二维码识别

    🔥 优质竞赛项目系列,今天要分享的是 🚩 python+opencv+深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/danch

    2024年02月12日
    浏览(57)
  • aruco二维码检测原理详解与基于opencv的代码实现(自己详细整理)

    aruco二维码检测原理讲解及基于opencv的代码和ros功能包实现 20240403 aruco二维码介绍 aruco又称为aruco标记、aruco标签、aruco二维码等,其中 CharucoBoard GridBoard AprilTag 原理相通,只是生成字典不同,而AprilTag用于机器人领域或可编程摄像头比较多,而aruco CharucoBoard GridBoard则用于AR应用

    2024年04月13日
    浏览(44)
  • 12. openCV在QT环境中利用zBar开发库实现二维码内容识别

    1. 说明 本篇博客仅记录如何使用zBar库进行二维码内容的识别,其中牵扯到的一些其它知识点,比如二维码区域检测、zBar库开发环境配置等可以参考本专栏的其它相关博客,此篇博客不再赘述。 2. 具体步骤 博客中代码功能:手动选择一张包含二维码的图片,会将检测到的二

    2024年01月24日
    浏览(37)
  • 单目相机测距(3米范围内)二维码实现方案(python代码 仅仅依赖opencv)

    总体思路:先通过opencv 识别二维码的的四个像素角位置,然后把二维码的物理位置设置为 ,相当于这是一个任意找的物体上的四个点,对应的我们找到了在图像中对应的像素坐标。这就解决了世界坐标系与像素坐标系之间的对应问题,然后再通过PNP求解的方式,就可以通过

    2024年02月04日
    浏览(46)
  • 什么是二维码?带你快速了解二维码的原理

    二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。与一维条码不同的是,二维条码的长度和宽度都可以记载数据,而一维条码仅宽度记载数据。二维条码还有独特的“定位点”和“

    2024年01月16日
    浏览(42)
  • Python用opencv实现动态识别二维码,以及加强版Python GUI(图像用户界面编程)

            关于动态识别二维码信息,利用电脑摄像头动态扫描二维码,扫描视频中的二维码。         由于我在项目中设计了一个PC端执行软件,所以用到了GUI编程,即图像用户界面编程,所以把关于这部分的GUI编程取了出来写在了下面。实际上用上面这个程序已经可以识

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包