<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
投影變換(仿射變換)
在數學中,線性變換是將一個向量空間對映到另一個向量空間的函數,通常由矩陣實現。如果對映保留向量加法和標量乘法,則對映被認為是線性變換。
要將線性變換應用於向量(即,一個點的座標,在我們的例子中——畫素的 x 和 y 值),需要將該向量乘以表示線性變換的矩陣。作為輸出,你將獲得一個座標轉換後的向量。
投影變換可以用以下矩陣表示:
其中:
是一個旋轉矩陣。該矩陣定義了將要執行的變換型別:縮放、旋轉等。
是平移向量。它只是移動點。
是投影向量。對於仿射變換,該向量的所有元素始終等於 0。
如果 x 和 y 是一個點的座標,則可以通過簡單的乘法進行變換:
這裡,x' 和 y' 是變換點的座標。
這就是仿射變換的全部理論。現在我將深入研究該程式:
步驟 1:讀取源影象並獲取源影象大小:
# Read source image img_src = cv2.imread('source_image.jpg') h, w, c = img_src.shape # Get source image parameter: #[[left,top], [left,bottom], [right, top], [right, bottom]] img_src_coordinate = np.array([[0,0],[0,h],[w,0],[w,h]])
根據源影象,我們將得到相關座標如下:
[[左,上],[左,下],[右,上],[右,下]]
好的!現在我們使用 get_paste_position 來獲取目標影象中的座標,源影象將被貼上到該座標。
def get_paste_position(event, x, y, flags, paste_coordinate_list): cv2.imshow('collect coordinate', img_dest_copy) if event == cv2.EVENT_LBUTTONUP: # Draw circle right in click position cv2.circle(img_dest_copy, (x, y), 2, (0, 0, 255), -1) # Append new clicked coordinate to paste_coordinate_list paste_coordinate_list.append([x, y])
點選4個點後,我們將4個點儲存到paste_coordinate_list:
while True: cv2.waitKey(1) if len(paste_coordinate) == 4: break
然後,這 4 個點將通過 cv2.findHomography 計算投影變換矩陣。
matrix, _ = cv2.findHomography(img_src_coordinate, paste_coordinate, 0)
得到投影變換矩陣後,我們將使用 cv2.warpPerspective 將源影象轉換為具有目標影象大小的透檢視像。
perspective_img = cv2.warpPerspective(img_src, matrix, (img_dest.shape[1], img_dest.shape[0]))
這是透檢視的樣子:
透檢視
最後,將透檢視像應用於目標影象,這就是最終效果:
完整程式碼:
import cv2 as cv2 import numpy as np # This function will get click pixel coordinate that source image will be pasted to destination image def get_paste_position(event, x, y, flags, paste_coordinate_list): cv2.imshow('collect coordinate', img_dest_copy) if event == cv2.EVENT_LBUTTONUP: # Draw circle right in click position cv2.circle(img_dest_copy, (x, y), 2, (0, 0, 255), -1) # Append new clicked coordinate to paste_coordinate_list paste_coordinate_list.append([x, y]) if __name__ == '__main__': # Read source image img_src = cv2.imread('woman-1807533_960_720.webp', cv2.IMREAD_COLOR) # cv2.imwrite('source_image.jpg', img_src) h, w, c = img_src.shape # Get source image parameter: [[left,top], [left,bottom], [right, top], [right, bottom]] img_src_coordinate = np.array([[0,0],[0,h],[w,0],[w,h]]) # Read destination image img_dest = cv2.imread('billboard-g7005ff0f9_1920.jpg', cv2.IMREAD_COLOR) # copy destination image for get_paste_position (Just avoid destination image will be draw) img_dest_copy = img_dest.copy()#np.tile(img_dest, 1) # paste_coordinate in destination image paste_coordinate = [] cv2.namedWindow('collect coordinate') cv2.setMouseCallback('collect coordinate', get_paste_position, paste_coordinate) while True: cv2.waitKey(1) if len(paste_coordinate) == 4: break paste_coordinate = np.array(paste_coordinate) # Get perspective matrix matrix, _ = cv2.findHomography(img_src_coordinate, paste_coordinate, 0) print(f'matrix: {matrix}') perspective_img = cv2.warpPerspective(img_src, matrix, (img_dest.shape[1], img_dest.shape[0])) cv2.imshow('img', perspective_img) cv2.copyTo(src=perspective_img, mask=np.tile(perspective_img, 1), dst=img_dest) cv2.imshow('result', img_dest) cv2.waitKey() cv2.destroyAllWindows()
到此這篇關於Python使用 OpenCV 進行影象投影變換的文章就介紹到這了,更多相關Python OpenCV 影象投影內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45