2016-07-13 10 views
0

Я пытаюсь преобразовать расстояние преобразования от метра к пикселю в розовом узле, с библиотекой pcl и kinect xbox. Я использовал приведенный ниже код для доступа к евклидовым координатам каждой точки из кинцевого узла ros, который находится в метре. Но я хотел получить эти измерения в пиксельной единице. Что мне делать?преобразование счетчика в пиксельный блок

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); 
} 

Здесь Р [сырые] [Col] представляет собой структуру, которая содержит точки х, у, г координаты значение в метр, который я требуется преобразовать в блоке пикселей. Поскольку я вижу, что значение единицы пикселя не является постоянным, поэтому can not использовать любое значение, найденное в google. У меня есть аналогичный вопрос: Kinect depth conversion from mm to pixels, но у него нет решения.

+0

Ну, данные x и y должны быть рассчитаны с использованием тригонометрии, зависящей от данных z. Это то, что вы просите о тригонометрических методах его решения? – Sean

ответ

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.