使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn)
代碼:
__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"
import os
import cv2
import numpy as np
from tqdm import tqdm
def undistort(frame):
fx = 685.646752
cx = 649.107905
fy = 676.658033
cy = 338.054431
k1, k2, p1, p2, k3 = -0.363219, 0.093818, 0.006178, -0.003714, 0.0
# 相機(jī)坐標(biāo)系到像素坐標(biāo)系的轉(zhuǎn)換矩陣
k = np.array([
[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]
])
# 畸變系數(shù)
d = np.array([
k1, k2, p1, p2, k3
])
h, w = frame.shape[:2]
mapx, mapy = cv2.initUndistortRectifyMap(k, d, None, k, (w, h), 5)
return cv2.remap(frame, mapx, mapy, cv2.INTER_LINEAR)
# 對(duì)攝像頭實(shí)時(shí)視頻流做畸變矯正
def distortion_correction_cam():
cap = cv2.VideoCapture(0)
while (cap.isOpened()):
ret, frame = cap.read()
undistort_frame = undistort(frame)
compare = np.hstack((frame, undistort_frame))
cv2.imshow('frame', compare)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 對(duì)目錄下的所有圖片做畸變矯正,并把畸變矯正后的圖片保存下來(lái)
def distortion_correction_imgs(input_dir, output_dir):
in_imgs = os.listdir(input_dir)
for img_name in tqdm(in_imgs):
image = cv2.imread(os.path.join(input_dir, img_name))
distroted_img = undistort(image)
cv2.imwrite(os.path.join(output_dir, img_name), distroted_img)
if __name__ == '__main__':
input_dir = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/root/images"
output_dir = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/root/distro_imgs"
# distortion_correction_imgs(input_dir, output_dir)
distortion_correction_cam()對(duì)圖片進(jìn)行矯正效果:
原圖:

矯正后的圖片:

采集的攝像頭畫(huà)面矯正效果:

從上面的換面可以看到,左邊是未矯正的畫(huà)面,右邊是矯正后的畫(huà)面:
矯正后的畫(huà)面會(huì)被裁切,明顯可以看到畫(huà)面中的信息是有裁切的,例如左邊的椅子已經(jīng)被裁切掉了- 矯正后的畫(huà)面和原畫(huà)面是保持相同的分辨率:
640x480,但是,為什么會(huì)看到畫(huà)面會(huì)出現(xiàn)橫向的拉伸,這是因?yàn)?code>標(biāo)定相機(jī)內(nèi)參的時(shí)候畫(huà)面的分辨率設(shè)置為1280x720=16:9,但是opencv讀取攝像頭默認(rèn)的分辨率卻是640x480=4:3,兩者的比例都不一樣,所以肯定會(huì)出現(xiàn)拉伸
解決拉伸的方式,就是把讀取攝像頭的時(shí)候,把攝像頭的分辨率設(shè)置成和標(biāo)定的時(shí)候一樣的分辨率,設(shè)置為1280x720,下面是如何在opencv讀取攝像頭的時(shí)候設(shè)置攝像頭分辨率:
# 對(duì)攝像頭實(shí)時(shí)視頻流做畸變矯正
def distortion_correction_cam():
cap = cv2.VideoCapture(0)
# 獲取攝像頭讀取畫(huà)面的寬和高
width = cap.get(3)
height = cap.get(4)
fps = cap.get(5)
print(width, height, fps) # 640.0 480.0 30.0
# 在這里把攝像頭的分辨率修改為和我們標(biāo)定時(shí)使用的一樣的分辨率 1280x720
cap.set(3, 1280)
cap.set(4, 720)
width = cap.get(3)
height = cap.get(4)
print(width, height, fps) # 1280.0 720.0 30.0
while (cap.isOpened()):
ret, frame = cap.read()
print(frame.shape)
undistort_frame = undistort(frame)
compare = np.hstack((frame, undistort_frame))
cv2.imshow('frame', compare)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()重新設(shè)置分辨率后,矯正前后畫(huà)面對(duì)比,可以看到幾乎是沒(méi)有橫向或縱向拉伸的!

參考:
https://blog.csdn.net/weixin_40516558/article/details/103494029
https://blog.csdn.net/guaiderzhu1314/article/details/96306509
https://www.codenong.com/cs110623399/
到此這篇關(guān)于使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python opencv畸變圖像矯正內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch中torch.utils.checkpoint()及用法詳解
在PyTorch中,torch.utils.checkpoint?模塊提供了實(shí)現(xiàn)梯度檢查點(diǎn)(也稱為checkpointing)的功能,這篇文章給大家介紹了Pytorch中torch.utils.checkpoint()的相關(guān)知識(shí),感興趣的朋友一起看看吧2024-03-03
使用python PIL庫(kù)實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼的去噪方法步驟
這篇文章主要介紹了使用python PIL庫(kù)實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼的去噪方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
對(duì)python numpy數(shù)組中冒號(hào)的使用方法詳解
下面小編就為大家分享一篇對(duì)python numpy數(shù)組中冒號(hào)的使用方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python實(shí)戰(zhàn)項(xiàng)目之MySQL tkinter pyinstaller實(shí)現(xiàn)學(xué)生管理系統(tǒng)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用MySQL、tkinter、 pyinstaller實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng),大家可以通過(guò)案例查缺補(bǔ)漏,提升水平2021-10-10
python從網(wǎng)絡(luò)讀取圖片并直接進(jìn)行處理的方法
這篇文章主要介紹了python從網(wǎng)絡(luò)讀取圖片并直接進(jìn)行處理的方法,涉及cStringIO模塊模擬本地文件的使用技巧,需要的朋友可以參考下2015-05-05
詳解Django模板層過(guò)濾器和繼承的問(wèn)題
今天抽空給大家介紹Django模板層過(guò)濾器和繼承的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
python 爬蟲(chóng)網(wǎng)頁(yè)登陸的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了python 爬蟲(chóng)網(wǎng)頁(yè)登陸的簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

