我已经使用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协议从我的相机获取图像,我可以从里面运行东西,但我不知道我应该如何能够插入矩阵和参数,以便无失真实时图像。有谁能给我一个关于这个的亮点?
谢谢。
答案 0 :(得分:1)
如果没有看到用于从相机中提取图像的代码,则很难提供建议。一般来说,如果您的帧速率要求足够低,您可以从相机中抓取像素缓冲区,将它们复制到cv图像中并应用unistort。
在较高的帧速率下,cv undistort可能证明太慢,因为它在双线性(或三线性)插值步骤之前计算每个像素的非线性变换。
然后你有两个选择
预计算扭曲贴图。这些是缓存上述非线性计算的矩阵(在两个通道中,分别是水平和垂直方向),并为每个帧重用它。这种方法的OpenCV implementation有些蹩脚,因为它需要与输入图像大小相同的变换图,当失真到处都是平滑且足够温和以至于可以通过下采样来逃避时,这是浪费的。在这些情况下,对于足够大的图像和帧速率,全尺寸地图中的查找是浪费的,并且可能成为瓶颈。如果使用下采样滚动自己的warp映射实现,必须注意采样率足够高以保证各处的正确失真(特别是在图像边界处)。这通常具有这样的效果:经线图比它们需要的“更密集”,因为图像边界处的失真通常比在中心处变得更陡。然而,这是一种简单且经常“足够好”的方法,许多专业应用程序广泛使用它(例如Shake)。
使用非均匀分段线性逼近。这里的想法是使用四叉树细分图像画布,直到近似每个四边形中的非线性扭曲的误差,使用由四边形本身的顶点扭曲引起的单应性,小于阈值(例如1/10像素)。优点是线性变形四边形很快并且可以在插值循环内实现。由于具有足够中等的失真,该技术仅使用少量四叉树,并且使用图形库(例如OpenGL)的简单实现,很容易在大分辨率下实现高帧速率。我个人在大约十年前开始使用这种技术,并且可以在高清视频分辨率下以60FPS轻松消解图像。