最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv矩形輪廓頂點的具體位置確定的兩種實現(xiàn)方法

 更新時間:2025年07月08日 09:26:41   作者:qq_47150350  
本文主要介紹了opencv矩形輪廓頂點的具體位置確定,通過線性規(guī)劃和最小面積矩兩種方法定位紙張四個頂點,具有一定的參考價值,感興趣的可以了解一下

一、問題的引入

opencv在圖像處理方面有著非常強大的功能,當(dāng)我們需要使用opencv進行一些圖像的矯正工作時,我們通常需要找到原圖的一些關(guān)鍵點,然后計算變換后的圖像坐標(biāo),最后通過仿射變換或者透視變換獲得自己想要的矯正圖像,比如將一張拍歪了的紙進行矯正,我們的首要任務(wù)就是找到原圖的一些關(guān)鍵點,通常的做法就是找紙張的4個頂點。

二、問題的解決方法

第一步我們肯定要找到紙張相應(yīng)的矩形輪廓,這里可以二值化再找,也可以使用一些算子查找,而本文的重點是解決怎樣根據(jù)矩形輪廓去確定它具體的4個頂點的位置。

方法一:

使用線性規(guī)劃的方法,在opencv的坐標(biāo)系下使用x+y=z1和x-y=z2兩條直線去切輪廓,分別當(dāng)z1取最大時(x,y)是右下點,最小時是左上點;當(dāng)z2取最大時(x,y)是右上點,最小時是左下點,如下圖:

這個方法單獨從輪廓的角度來說,只要旋轉(zhuǎn)的角度不要剛剛好是45°或者135°,這個方法就沒有問題,它得到的就是輪廓相對應(yīng)的右下點、左上點、右上點、左下點,但不是原目標(biāo)的相應(yīng)點,就好像當(dāng)紙張旋轉(zhuǎn)超過45°時,這個方法得到的對于輪廓來說是正確的,但對于紙張來說就不對了,如下圖:

這個時候如果按之前的一樣進行矯正就會得到一個橫放的紙張,這樣里面的字都是橫的,就不是我們想要的了所以這個方法要用來矯正的話,就需要對圖像的旋轉(zhuǎn)角度有一個計算和判斷,可以通過下面代碼獲取角度:

#cnt:輸入輪廓,angle:返回角度
(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

方法二

這個方法首先要使用輪廓獲得其最小面積矩,然后觀察研究矩形的性質(zhì)可以根據(jù)當(dāng)前的形狀給出適合的x,y判斷式,觀察下圖:

#找輪廓最小矩 cnt:輪廓  box:4個點無規(guī)律
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)

對于這樣一個高比寬長的矩形,我們的方法是先將4個點按y從小到大進行排序,再取前兩個按x從小到大進行排序,小的那個是左下,大的那個是右下;最后取后兩個也按x從小到大進行排序,小的那個是左上,大的那個是右上。假如是一個寬比高長的矩形,我們就可以先按x的大小進行排序。這個從代碼角度實現(xiàn)可能更為簡潔,適用特定輪廓,對角度要求就更寬泛了些,除非旋轉(zhuǎn)到了像上圖右邊一樣的狀況,而這種矯正一般出現(xiàn)的機率非常小。

三、一些實現(xiàn)代碼

1、下面是使用方法一實現(xiàn)的頂點定位

import numpy as np
import cv2
def get4points(img: np.ndarray, thed, n):
    """
    :param img  the color image which shape is [height, width, depth]
    :return 4 point locations in list or tuple, for example: [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
    """

    #灰度和二值化
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, binary = cv2.threshold(gray,thed,255,cv2.THRESH_BINARY)

    # 搜索輪廓
    contours, hierarchy = cv2.findContours(
        binary,
        cv2.RETR_LIST,
        cv2.CHAIN_APPROX_SIMPLE)

    #按輪廓長度選取需要輪廓
    len_list = []
    for i in range(len(contours)):
        len_list.append(len(contours[i]))

    #選第二長的
    sy = np.argsort(np.array(len_list))[-n]

    #尋找頂點
    sum_list = []
    dif_list = []
    for i in contours[sy]:
        sum = i[0][0]+i[0][1]
        sum_list.append(sum)
        dif_list.append(i[0][0]-i[0][1])

    id_lb = np.argsort(np.array(sum_list))
    id_lb2 = np.argsort(np.array(dif_list))
    lu_id , rd_id = id_lb[0] , id_lb[-1]
    ld_id , ru_id = id_lb2[0] , id_lb2[-1]

    points = np.array([contours[sy][lu_id][0],contours[sy][rd_id][0],contours[sy][ld_id][0],contours[sy][ru_id][0]])

    return points , contours , sy

2、下面是使用方法2實現(xiàn)的頂點定位

def getpoints(binary: np.ndarray  , num: int ):
    # 搜索輪廓
    contours, hierarchy = cv2.findContours(
        binary,
        cv2.RETR_LIST,
        cv2.CHAIN_APPROX_SIMPLE)

    #按輪廓位置最左(x最小)選取
    x_list = []
    for i in contours:
        x_sum = 0
        for kk in i:
            x_sum += kk[0][0]
        x_av = x_sum/len(i)
        x_list.append(x_av)

    sy = np.argsort(np.array(x_list))[num]
    cnt = contours[sy]
    
    #找輪廓最小矩
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)

    return box , contours , sy

def findpoints(points):
    #區(qū)分矩形頂點位置
    point_y=sorted(points,key=lambda t:t[1])
    lu, ru =sorted(point_y[:2],key=lambda t:t[0])
    ld, rd =sorted(point_y[2:],key=lambda t:t[0])

    return [list(lu), list(ld), list(ru),list(rd)]

3、下面是一些展示代碼

#展示頂點
def show_points(img , points):
    point_size = 8
    point_color = (0, 0, 255) # BGR
    thickness = 4 # 可以為 0 、4、8
    points_list = [tuple(i) for i in np.int32(points).reshape(-1,2)]
    for point in points_list:
        cv2.circle(img, point, point_size, point_color, thickness)
    img = cv2.resize(img,(808,808))
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # cv2.imwrite('dd.jpg',img)

#展示輪廓
def show_Contour(img , contours , sy):
    cv2.drawContours(img, contours , sy , (25, 254, 0), 4)
    img = cv2.resize(img,(808,808))
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # cv2.imwrite('mm.jpg',img)

到此這篇關(guān)于opencv矩形輪廓頂點的具體位置確定的兩種實現(xiàn)方法的文章就介紹到這了,更多相關(guān)opencv矩形輪廓頂點內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    這篇文章主要介紹了python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06
  • 使用Python實現(xiàn)一個棧判斷括號是否平衡

    使用Python實現(xiàn)一個棧判斷括號是否平衡

    棧(Stack)在計算機領(lǐng)域是一個被廣泛應(yīng)用的集合,棧是線性集合,訪問都嚴(yán)格地限制在一段,叫做頂(top)。這篇文章主要介紹了使用Python實現(xiàn)一個棧判斷括號是否平衡,需要的朋友可以參考下
    2018-08-08
  • 使用Python神器對付12306變態(tài)驗證碼

    使用Python神器對付12306變態(tài)驗證碼

    這篇文章主要介紹了使用Python神器對付12306變態(tài)驗證碼的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 使用Python opencv實現(xiàn)視頻與圖片的相互轉(zhuǎn)換

    使用Python opencv實現(xiàn)視頻與圖片的相互轉(zhuǎn)換

    這篇文章主要介紹了使用Python opencv實現(xiàn)視頻與圖片的相互轉(zhuǎn)換,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • python3將變量寫入SQL語句的實現(xiàn)方式

    python3將變量寫入SQL語句的實現(xiàn)方式

    這篇文章主要介紹了python3將變量寫入SQL語句的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python 列表 sort()函數(shù)使用實例詳解

    Python 列表 sort()函數(shù)使用實例詳解

    這篇文章主要介紹了Python 列表 sort()函數(shù)使用詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 基于Python開發(fā)的桌面級文件備份工具

    基于Python開發(fā)的桌面級文件備份工具

    在數(shù)字化時代,數(shù)據(jù)備份已成為個人和企業(yè)數(shù)據(jù)管理的重要環(huán)節(jié),本文將詳細(xì)介紹如何使用Python開發(fā)一款功能全面的桌面級文件備份工具,該工具不僅支持即時備份,還能實現(xiàn)定時自動備份、增量備份等專業(yè)功能,需要的朋友可以參考下
    2026-01-01
  • Python使用QQ郵箱發(fā)送郵件報錯smtplib.SMTPAuthenticationError

    Python使用QQ郵箱發(fā)送郵件報錯smtplib.SMTPAuthenticationError

    這篇文章主要介紹了Python使用QQ郵箱發(fā)送郵件報錯smtplib.SMTPAuthenticationError,簡單介紹了python 發(fā)送郵件的步驟,需要的朋友可以參考下
    2019-12-12
  • Python的歷史與優(yōu)缺點整理

    Python的歷史與優(yōu)缺點整理

    在本篇文章里小編給大家分享的是關(guān)于Python優(yōu)缺點及基礎(chǔ)知識點整理內(nèi)容,有需要的朋友們可以參考下。
    2020-05-05
  • python用requests實現(xiàn)http請求代碼實例

    python用requests實現(xiàn)http請求代碼實例

    這篇文章主要介紹了python用requests實現(xiàn)http請求過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

改则县| 高台县| 张北县| 霞浦县| 新营市| 大埔县| 昭觉县| 滦南县| 阿坝| 巴里| 林周县| 商洛市| 专栏| 新竹县| 怀远县| 永康市| 将乐县| 普兰店市| 宁德市| 鄂托克前旗| 枞阳县| 辽阳县| 峨边| 昭通市| 沂源县| 东乌珠穆沁旗| 淮阳县| 正定县| 寿阳县| 仪征市| 合阳县| 江永县| 东乌珠穆沁旗| 乌鲁木齐县| 措勤县| 葫芦岛市| 阿图什市| 关岭| 涪陵区| 蒙阴县| 襄垣县|