Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将rgb值与透视投影中的像素位置关联?_Python_Image_Graphics_Computer Vision - Fatal编程技术网

Python 如何将rgb值与透视投影中的像素位置关联?

Python 如何将rgb值与透视投影中的像素位置关联?,python,image,graphics,computer-vision,Python,Image,Graphics,Computer Vision,在完成透视投影后,我尝试将rgb值与像素坐标关联。透视投影的方程式为: 其中,x,y是点的像素位置,x,y和Z是相机帧中点的位置,其他参数表示相机的固有参数。给定一个包含点位置和rgb值的点云,我想根据透视投影将rgb值与像素位置相关联 以下代码应创建正确的图像: import matplotlib.pyplot as plt import open3d as o3d import numpy as np cx = 325.5; cy = 253.5; fx = 518.0; fy = 519

在完成透视投影后,我尝试将rgb值与像素坐标关联。透视投影的方程式为:

其中,
x
y
是点的像素位置,
x
y
Z
是相机帧中点的位置,其他参数表示相机的固有参数。给定一个包含点位置和rgb值的点云,我想根据透视投影将rgb值与像素位置相关联

以下代码应创建正确的图像:

import matplotlib.pyplot as plt
import open3d as o3d
import numpy as np
cx = 325.5;
cy = 253.5;
fx = 518.0;
fy = 519.0;
K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
pcd = o3d.io.read_point_cloud('freiburg.pcd', remove_nan_points=True)
points = np.array(pcd.points)
colors = np.array(pcd.colors)
projection = (K @ points.T).T
normalization = projection / projection[:, [2]] #last elemet must be 1
pixel_coordinates = normalization.astype(int)
img = np.zeros((480, 640, 3))
#how can I fill the img appropriately? The matrix pixel coordinates should
# inform about where to place the color intensities.

for position, intensity in zip(pixel_coordinates, colors):
    row, column = position[0], position[1]
    #img[row, column, :] = intensity # returns with error 
    img[column, row, :] = intensity # gives a strange picture.
可以读取点云。我希望能够在最后一个循环中关联rgb值:

for position, intensity in zip(pixel_coordinates, colors):
    row, column = position[0], position[1]
    #img[row, column, :] = intensity # returns with error 
    img[column, row, :] = intensity # gives a strange picture.
奇怪的是,如果从第二行到最后一行没有注释,程序在尝试写入超出可用列范围的rgb值时返回和
IndexError
。但是,循环中的最后一行运行时没有问题。生成的图片和正确的图片如下所示:

如何修改上述代码以获得正确的图像?

有几个问题:

  • 您将忽略投影中的非线性失真。您正在与之比较的图像是否未失真?如果是,您确定投影矩阵K是与未失真图像关联的矩阵吗
  • 投影3D点将不可避免地在图像平面上生成点云,而不是连续图像。要生成稍微自然的图像,可能需要在2D点云中对附近的采样进行插值。插值过滤器的选择决定了结果的质量。例如,您可以首先制作一个rgb桶的图像,一个类似的权重图像,投影3d点,将其rgb值放置在最近的桶中(通过舍入投影x,y坐标获得的值),权重等于投影到桶中心距离的倒数(即舍入残差的欧几里德范数的倒数)。然后,首先计算输出像素值作为每个桶的加权平均值,然后,如果有任何未填充的桶,则将其填充(例如)填充邻域的双线性插值。最后一步将填充由已填充值包围的1像素孔。对于较大的孔,您需要选择某种填充过程

谢谢你,Francesco!你的评论对我很有帮助。关于你提出的问题:我不确定我得到的校准矩阵是否正确;它只有一个小数位是一个危险信号。关于你的第二条评论,我意识到
pixel\u坐标=normalization.astype(int)
不是一个好的投影,
像素坐标=np.round(标准化,0)。aType(int)
效果更好。我也将尝试您描述的插值方案。