国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv快速實現(xiàn)任意角度二維碼矯正

這篇具有很好參考價值的文章主要介紹了opencv快速實現(xiàn)任意角度二維碼矯正。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

那天聽到領(lǐng)導(dǎo)他們在討論,說要將圖片進(jìn)行個矯正處理,還叫來了算法部的大佬來討論將要如何處理這個,討論場面很是激烈

不得不說好奇心是個很神奇的東西,就把我給吸引過去了

我定眼一看,感覺作為JAVA開發(fā)的我自己也能進(jìn)行處理

因為看到了圖片后,發(fā)現(xiàn)了圖片中一個很重要的特征點:

要進(jìn)行矯正的圖片中都會有一個二維碼圖案,想要矯正的文字和二維碼圖案是處于同一水平線的。

如下面這個

opencv快速實現(xiàn)任意角度二維碼矯正
要把圖片中的“水中加點糖”四個字矯正,只需要把二維碼矯正就可以了。

具體想法就是,求得二維碼矯正的角度a,對原圖整體按照角度a進(jìn)行旋轉(zhuǎn)就可以了。

有了想法后,就趁熱打鐵,正好周末了在家試試。

一般圖片矯正方式

對于一般的圖片矯正,最常見的做法有這么兩種:

  • 對圖片進(jìn)行預(yù)處理獲取出輪廓,并求得輪廓的近似矩形,通過矩形的定位點來進(jìn)行透視變換
  • 對圖片進(jìn)行預(yù)處理后,進(jìn)行霍夫變換進(jìn)行直線檢測,再根據(jù)直線的傾斜角進(jìn)行旋轉(zhuǎn)

但是對于圖片中有二維碼的圖片進(jìn)行矯正就可以更加簡單了,因為二維碼中有定位點并且成熟框架很多,實現(xiàn)起來也更加方便且識別率非常高。

二維碼圖片矯正

思路

識別出二維碼的角點,通過相鄰兩個角點的坐標(biāo)計算出夾角度數(shù),再次用此度數(shù)對圖片進(jìn)行旋轉(zhuǎn)。

以下面圖為例:
opencv快速實現(xiàn)任意角度二維碼矯正

先獲取出二維碼正方向時底部的兩點坐標(biāo),并求得兩點的傾斜角。

斜率計算用初中數(shù)學(xué)中求兩點坐標(biāo)斜率的公式算一下即可,忘了就搜搜回憶一下:

兩點的斜率公式:k=(y1-y2)/(x1-x2),x1≠x2。其中(x1,y1),(x2,y2)是已知兩點的坐標(biāo),x1≠x2。

斜率是表示一條直線(或曲線的切線)關(guān)于(橫)坐標(biāo)軸傾斜程度的量。它通常用直線(或曲線的切線)與(橫)坐標(biāo)軸夾角的正切,或兩點的縱坐標(biāo)之差與橫坐標(biāo)之差的比來表示。記作k,k=tgα。
一條直線與某平面直角坐標(biāo)系橫坐標(biāo)軸正半軸方向所成的角的正切值即該直線相對于該坐標(biāo)系的斜率。如果直線與x軸互相垂直,直角的正切值為tan90°,故此直線不存在斜率(也可以說直線的斜率為無窮大)。當(dāng)直線L的斜率存在時,對于一次函數(shù)y=kx+b(斜截式),k即該函數(shù)圖像的斜率。

編碼實現(xiàn)

實現(xiàn)時對于二維碼的識別用到了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):
    """ 已知兩點坐標(biāo)計算角度 -
    :param x1: 原點橫坐標(biāo)值
    :param y1: 原點縱坐標(biāo)值
    :param x2: 目標(biāo)點橫坐標(biāo)值
    :param y2: 目標(biāo)縱坐標(biāo)值
    """
    dx = x2 - x1
    dy = y2 - y1
    # 求斜率
    k = dy / dx
    # 結(jié)果是弧度值
    angle = math.atan(k)
    # 弧度值轉(zhuǎn)為角度
    return angle * 180 / math.pi


def get_angle(qr_item):
    """
    獲取出進(jìn)行矯正所需要的角度
    """
    # 將坐標(biāo)從下到上,從左到右進(jìn)行排序
    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]
    # 執(zhí)行壓縮,按照500的寬度為標(biāo)準(zhǔn)
    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
    # 對圖片進(jìn)行壓縮
    img = resize_img(img)
    # symbol為64代表二維碼
    qr_result = pyzbar.decode(img, symbols=[64])
    if len(qr_result) == 1:
        # 識別到了一個二維碼,將二維碼朝上旋轉(zhuǎn)
        first_adjust_angle = to_up_angle(qr_result[0])
        # 進(jìn)行旋轉(zhuǎn)
        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)

最終輸出的圖片結(jié)果:
opencv快速實現(xiàn)任意角度二維碼矯正
矯正成功!

需要說明的是,上面之所以要進(jìn)行對圖片的resize,是因為圖片太大的話pyzbar可能會識別不出來二維碼文章來源地址http://www.zghlxwxcb.cn/news/detail-449858.html

到了這里,關(guān)于opencv快速實現(xiàn)任意角度二維碼矯正的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)字圖像處理二維碼識別python+opencv實現(xiàn)二維碼實時識別

    數(shù)字圖像處理二維碼識別python+opencv實現(xiàn)二維碼實時識別

    數(shù)字圖像處理二維碼識別 python+opencv實現(xiàn)二維碼實時識別 特點: (1)可以實現(xiàn)普通二維碼,條形碼; (2)解決了opencv輸出中文亂碼的問題 (3)增加網(wǎng)頁自動跳轉(zhuǎn)功能 (4)實現(xiàn)二維碼實時檢測和識別 代碼保證原創(chuàng)、無錯誤、能正常運行(如果電腦環(huán)境配置沒問題) 送二維

    2024年01月16日
    瀏覽(102)
  • 利用opencv實現(xiàn)二維碼檢測(簡單易上手)

    二維碼檢測是一個簡單易上手的小項目,掌握opencv基礎(chǔ)的語句就可以實現(xiàn)。解析二維碼的過程有專門的庫來實現(xiàn),所以只需調(diào)相應(yīng)的庫就好了。在實現(xiàn)這個代碼前,先要配置opencv環(huán)境。 Python與Opencv配置安裝_嗶哩嗶哩_bilibili?這里用anaconda配置很方便 攝像頭幀畫面的提取:調(diào)用

    2024年02月04日
    瀏覽(18)
  • opencv案例03 -基于OpenCV實現(xiàn)二維碼生成,發(fā)現(xiàn),定位,識別

    opencv案例03 -基于OpenCV實現(xiàn)二維碼生成,發(fā)現(xiàn),定位,識別

    廢話不多說,直接上代碼 運行效果: 會在當(dāng)前目前生成一張圖片 對生成的二維碼識別 opencv從4代之后推出了二維碼識別接口.調(diào)用方法是這樣的.代碼如下: 運行結(jié)果: 返回值有三個, 第一個result就是解碼后的內(nèi)容,例如我這個二維碼的結(jié)果是\\\"B0018\\\",當(dāng)然也可以是個純數(shù)字. 第二

    2024年02月11日
    瀏覽(36)
  • 微信小程序任意指定頁面生成二維碼

    微信小程序任意指定頁面生成二維碼

    在日常微信小程序運營中,文章,和朋友圈海報內(nèi)總會用到微信小程序特定頁面二維碼 ps:一定要輸入當(dāng)前小程序小程序項目成員的微信號

    2024年02月11日
    瀏覽(26)
  • 計算機競賽 python+opencv+深度學(xué)習(xí)實現(xiàn)二維碼識別

    計算機競賽 python+opencv+深度學(xué)習(xí)實現(xiàn)二維碼識別

    ?? 優(yōu)質(zhì)競賽項目系列,今天要分享的是 ?? python+opencv+深度學(xué)習(xí)實現(xiàn)二維碼識別 ??學(xué)長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 該項目較為新穎,適合作為競賽課題方向,學(xué)長非常推薦! ?? 更多資料, 項目分享: https://gitee.com/danch

    2024年02月12日
    瀏覽(23)
  • aruco二維碼檢測原理詳解與基于opencv的代碼實現(xiàn)(自己詳細(xì)整理)

    aruco二維碼檢測原理詳解與基于opencv的代碼實現(xiàn)(自己詳細(xì)整理)

    aruco二維碼檢測原理講解及基于opencv的代碼和ros功能包實現(xiàn) 20240403 aruco二維碼介紹 aruco又稱為aruco標(biāo)記、aruco標(biāo)簽、aruco二維碼等,其中 CharucoBoard GridBoard AprilTag 原理相通,只是生成字典不同,而AprilTag用于機器人領(lǐng)域或可編程攝像頭比較多,而aruco CharucoBoard GridBoard則用于AR應(yīng)用

    2024年04月13日
    瀏覽(28)
  • 12. openCV在QT環(huán)境中利用zBar開發(fā)庫實現(xiàn)二維碼內(nèi)容識別

    12. openCV在QT環(huán)境中利用zBar開發(fā)庫實現(xiàn)二維碼內(nèi)容識別

    1. 說明 本篇博客僅記錄如何使用zBar庫進(jìn)行二維碼內(nèi)容的識別,其中牽扯到的一些其它知識點,比如二維碼區(qū)域檢測、zBar庫開發(fā)環(huán)境配置等可以參考本專欄的其它相關(guān)博客,此篇博客不再贅述。 2. 具體步驟 博客中代碼功能:手動選擇一張包含二維碼的圖片,會將檢測到的二

    2024年01月24日
    瀏覽(22)
  • 單目相機測距(3米范圍內(nèi))二維碼實現(xiàn)方案(python代碼 僅僅依賴opencv)

    單目相機測距(3米范圍內(nèi))二維碼實現(xiàn)方案(python代碼 僅僅依賴opencv)

    總體思路:先通過opencv 識別二維碼的的四個像素角位置,然后把二維碼的物理位置設(shè)置為 ,相當(dāng)于這是一個任意找的物體上的四個點,對應(yīng)的我們找到了在圖像中對應(yīng)的像素坐標(biāo)。這就解決了世界坐標(biāo)系與像素坐標(biāo)系之間的對應(yīng)問題,然后再通過PNP求解的方式,就可以通過

    2024年02月04日
    瀏覽(22)
  • 什么是二維碼?帶你快速了解二維碼的原理

    什么是二維碼?帶你快速了解二維碼的原理

    二維條碼是指在一維條碼的基礎(chǔ)上擴展出另一維具有可讀性的條碼,使用黑白矩形圖案表示二進(jìn)制數(shù)據(jù),被設(shè)備掃描后可獲取其中所包含的信息。與一維條碼不同的是,二維條碼的長度和寬度都可以記載數(shù)據(jù),而一維條碼僅寬度記載數(shù)據(jù)。二維條碼還有獨特的“定位點”和“

    2024年01月16日
    瀏覽(24)
  • Python用opencv實現(xiàn)動態(tài)識別二維碼,以及加強版Python GUI(圖像用戶界面編程)

    ? ? ? ? 關(guān)于動態(tài)識別二維碼信息,利用電腦攝像頭動態(tài)掃描二維碼,掃描視頻中的二維碼。 ????????由于我在項目中設(shè)計了一個PC端執(zhí)行軟件,所以用到了GUI編程,即圖像用戶界面編程,所以把關(guān)于這部分的GUI編程取了出來寫在了下面。實際上用上面這個程序已經(jīng)可以識

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包