我正在尝试使用pcl库和kinect xbox将ros节点中的转换距离从米转换为像素。我使用下面的代码来访问ros节点内kinect的每个点的欧几里德坐标,以米为单位。但我想以像素为单位进行测量。我该怎么办?
void
cloud_cb (const sensor_msgs::PointCloud2ConstPtr& input)
{
pcl::PointCloud<pcl::PointXYZRGB> output;
pcl::fromROSMsg(*input,output );
for(int i=0;i<=400;i++)
{
for(int j=0;j<=400;j++)
{
p[i][j] = output.at(i,j);
ROS_INFO("\n p.z = %f \t p.x = %f \t p.y = %f",p[i][j].z,p[i][j].x,p[i][j].y);
}
}
sensor_msgs::PointCloud2 cloud;
pcl::toROSMsg(output,cloud);
pub.publish (cloud);
}
这里P [raw] [col]是一个Point结构,它包含以米为单位的x,y,z坐标值,我想以像素为单位进行转换。因为我看到像素单位的值不是常数,所以不能使用谷歌中找到的任何值。 我在这里得到了类似的问题:Kinect depth conversion from mm to pixels,但它没有解决方案。
答案 0 :(得分:0)
尝试将米转换为像素存在问题。像素不是标准单位。根据屏幕分辨率和屏幕尺寸,1像素的物理尺寸因设备而异。
如果你知道屏幕的分辨率,那么转换仍然是非常重要的。
const int L = 1920; //screen width
const int H = 1280; //screen height
for(int i=0;i<=L;i++){
for(int j=0;j<=H;j++){
p[i][j] = output.at(i*400/L,j*400/H);
}
}
因此,对于每个像素,您将具有与地图中的深度值对应的深度值。这需要进行一些int
转换和改进。