利用OPENCV和实时vid中的固有矩阵和畸变系数进行摄像机标定

2024-05-14 12:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用了opencv提供的校准代码来校准我的相机,一切正常!通过使用Python编写的代码应用参数,我也可以不失真任何图像。在

import numpy as np
import cv2

# copy parameters to arrays
K = np.array([[385.58130632872212, 0, 371.50000000000000], [0, 385.58130632872212, 236.50000000000000], [0, 0, 1]])
d = np.array([-0.27057628187805571, 0.10522881965331317, 0, 0, 0]) # just use first two terms (no translation)

# read one of your images
img = cv2.imread("C:\Users\ROS\Documents\Python\VCSBC2.jpg")
h, w = img.shape[:2]

# undistort
newcamera, roi = cv2.getOptimalNewCameraMatrix(K, d, (w,h), 0) 
newimg = cv2.undistort(img, K, d, None, newcamera)

cv2.imwrite("original.jpg", img)
cv2.imwrite("undistorted.jpg", newimg)

但问题是,我真的不知道如何在实时传输过程中不失真图像。我使用TCP/IP协议从我的相机中获取图像,我可以从它内部运行一些东西,但是我不知道如何才能在那里插入矩阵和参数,以便实时获得未失真的图像。有谁能给我一点启示吗?在

谢谢。在


Tags: 代码图像importimg参数nparraycv2
1条回答
网友
1楼 · 发布于 2024-05-14 12:53:31

如果没有看到你用来从相机上提取图像的代码,很难给出建议。一般来说,如果你的帧速率要求很低,你可以从相机抓取像素缓冲区,复制到cv图像中,然后应用“不失真”。在

在较高的帧速率下,cv不失真可能证明太慢,因为它在双线性(或三线性)插值步骤之前计算每个像素的非线性变换。在

然后你有两个选择

  1. 预计算扭曲贴图。这些矩阵缓存上述非线性计算(在两个通道中,分别在水平和垂直方向),并对每个帧重用它。这种方法的OpenCV implementation有点蹩脚,因为它需要与输入图像大小相同的变换映射,当失真到处都是平滑和适度的,以至于可以通过下采样来逃脱时,这是浪费。在这些情况下,对于足够大的图像和帧速率,在全尺寸地图中查找是浪费,并且可能成为瓶颈。如果有人使用下采样来实现warp map,则必须注意采样率足够高,以保证所有地方(尤其是图像边界)的正确失真。这通常会导致扭曲贴图的“密度”大于所需的密度,因为图像边界处的扭曲通常比中心处的扭曲更陡峭。然而,它是一种简单且通常“足够好”的方法,许多专业应用程序广泛使用它(例如Shake)。

  2. 使用非均匀分段线性近似。这里的想法是使用四叉树对图像画布进行细分,直到使用仅扭曲四边形顶点所产生的单应性来近似每个四边形中的非线性扭曲的误差小于阈值(例如像素的1/10)。优点是线性扭曲四边形是快速的,可以在插值循环内实现。由于失真度适中,这种技术只使用少量的四叉树,并且使用图形库(例如OpenGL)的简单实现,很容易在大分辨率下获得高帧速率。我个人在大约十年前就开始使用这项技术,并且可以很容易地在高清视频分辨率下以60FPS的速度对图像进行脱色处理。

相关问题 更多 >

    热门问题