日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

opencv:畸变矫正:透视变换算法的思想与实现

發(fā)布時(shí)間:2023/11/29 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv:畸变矫正:透视变换算法的思想与实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

畸變矯正


注意:雖然能夠成功矯正但是也會(huì)損失了部分圖像!

透視變換(Perspective Transformation)

概念:

透視變換是將圖片投影到一個(gè)新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。 我們常說(shuō)的仿射變換是透視變換的一個(gè)特例。 透視變換的目的就是把現(xiàn)實(shí)中為直線的物體,在圖片上可能呈現(xiàn)為斜線,通過(guò)透視變換轉(zhuǎn)換成直線 的變換。 仿射變換(Affine Transformation或 Affine Map),又稱為仿射映射,是指在幾何中,圖像進(jìn)行從 一個(gè)向量空間進(jìn)行一次線性變換和一次平移,變換為到另一個(gè)向量空間的過(guò)程。

思想:

通用的變換公式為:

x,y是原始圖片坐標(biāo),對(duì)應(yīng)得到變換后的圖片坐標(biāo)(X’;Y’;Z’)其中:

可以看作原圖像的數(shù)據(jù)各值與變換后圖像的數(shù)據(jù)各值,對(duì)應(yīng)相等。
令a33=1,展開(kāi)上面公式,得到一個(gè)點(diǎn)的情況:

如果我們要解出上面含有8個(gè)未知量(a)的方程,我們需要8個(gè)像素點(diǎn),原圖像4個(gè),新圖像4個(gè)。
源點(diǎn)四個(gè)坐標(biāo)分別為A:(x0,y0),(x1,y1),(x2,y2),(x3,y3) 目標(biāo)點(diǎn)四個(gè)坐標(biāo)分別為B:(X’0,Y’0),(X’1,Y’1),(X’2,Y’2),(X’3,Y’3)

手動(dòng)代碼實(shí)現(xiàn):

import numpy as npdef WarpPerspectiveMatrix(src, dst):assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4#assert:當(dāng)src的格式等于dst的格式,并且src的格式大于等于4,程序才繼續(xù)運(yùn)行nums = src.shape[0]A = np.zeros((2*nums, 8)) # A*warpMatrix=BB = np.zeros((2*nums, 1))for i in range(0, nums):A_i = src[i,:]B_i = dst[i,:]A[2*i, :] = [A_i[0], A_i[1], 1, 0, 0, 0,-A_i[0]*B_i[0], -A_i[1]*B_i[0]]B[2*i] = B_i[0]A[2*i+1, :] = [0, 0, 0, A_i[0], A_i[1], 1,-A_i[0]*B_i[1], -A_i[1]*B_i[1]]B[2*i+1] = B_i[1]A = np.mat(A)#用A.I求出A的逆矩陣,然后與B相乘,求出warpMatrixwarpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32#之后為結(jié)果的后處理warpMatrix = np.array(warpMatrix).T[0]warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1warpMatrix = warpMatrix.reshape((3, 3))return warpMatrixif __name__ == '__main__':print('warpMatrix')src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]] #編造的輸入src = np.array(src)dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]] #編造的輸出dst = np.array(dst)warpMatrix = WarpPerspectiveMatrix(src, dst)print(warpMatrix)

這里就不展示結(jié)果了 重點(diǎn)是思想

opencv接口代碼實(shí)現(xiàn):

import cv2 import numpy as npimg = cv2.imread('photo1.jpg')result3 = img.copy()#img = cv2.GaussianBlur(img,(3,3),0) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #轉(zhuǎn)灰度,做單通道計(jì)算比較節(jié)省時(shí)間 edges = cv2.Canny(gray,50,150,apertureSize = 3) #canny邊緣檢測(cè)(僅針對(duì)這次的輸入圖片) cv2.imshow("canny", edges)''' 注意這里src和dst的輸入并不是圖像,而是圖像對(duì)應(yīng)的頂點(diǎn)坐標(biāo)。 ''' src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]]) dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]]) # 生成透視變換矩陣;進(jìn)行透視變換 m = cv2.getPerspectiveTransform(src, dst) result = cv2.warpPerspective(result3, m, (337, 488)) # (337,488)是輸出圖像大小 cv2.imshow("src", img) cv2.imshow("result", result) cv2.waitKey(0)

結(jié)果展示:

分別是:輸入圖片,邊緣提取,透視變換結(jié)果
成功將其原圖片中紙片矯正~
但是注意:雖然成功矯正但是也損失了部分圖像!

總結(jié)

以上是生活随笔為你收集整理的opencv:畸变矫正:透视变换算法的思想与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。