Я борюсь с глубинным цветовым отображением Kinect v2. Я использую записанные, а не живые данные, поэтому я не могу использовать CoordinateMapper.
Я придерживаюсь этого подхода: http://nicolas.burrus.name/index.php/Research/KinectCalibration
К сожалению, я нигде не могу найти параметры искажения kinect v2, поэтому я пропускаю преобразование необработанных значений глубины в метры. Кто-нибудь может это предоставить? Мое облако точек выглядит неплохо !, но моя цветовая карта не работает вообще. Для отладки я попытался создать преобразованное изображение (color_img_transformed) изображения bgr, но это выглядит очень неправильно:
for (int y = 0; y < depth.rows; ++y)
{
for (int x = 0; x < depth.cols; ++x)
{
float depthValue = (float) depth.at<float>(y,x);
pcl::PointXYZRGBA pt;
if (depthValue == -1000.f || depthValue == 0.0f || boost::math::isnan(depthValue))
{
}
else
{
//depthValue *= 1000; // i think values are already in mm
pt.x = (static_cast<float>(x + tmp_x) - centerX) * scaleFactorX * depthValue;
pt.y = (centerY - static_cast<float>(y + tmp_y)) * scaleFactorY * depthValue;
pt.z = depthValue;// new try to map - https://www.codefull.org/2016/03/align-depth-and-color-frames-depth-and-rgb-registration/
// Apply RGB intrinsics
Eigen::Vector4f tmp = extrinsics_ * Eigen::Vector4f(pt.x,pt.y,pt.z,1);float x_ = (tmp[0] * fx_rgb / tmp[2]) + cx_rgb;
float y_ = (tmp[1] * fy_rgb / tmp[2]) + cy_rgb;// "x" and "y" are indices into the RGB frame, but they may contain
// invalid values (which correspond to the parts of the scene not visible
// to the RGB camera.
// Do we have a valid index?
if (x_ > bgr.size().width || y_ > bgr.size().height || x_ < 1 || y < 1)
continue;
// Need some kind of interpolation. I just did it the lazy way
int round_x = (int) floor(x_);
int round_y = (int) floor(y_);cv::Vec3b colorValue = bgr.at<cv::Vec3b>(round_y, round_x);
RGBValue color;
color.Red = colorValue[2];
color.Green = colorValue[1];
color.Blue = colorValue[0];
pt.rgba = color.long_value;
color_img_transformed.at<cv::Vec3b>(round_y, round_x)[0] = 255;//colorValue[0];
color_img_transformed.at<cv::Vec3b>(round_y, round_x)[1] = 0;//colorValue[1];
color_img_transformed.at<cv::Vec3b>(round_y, round_x)[2] = 0;
}
}
}
Я не совсем уверен, правильно ли я использую внешние / внутренние данные. Кто-нибудь может прокомментировать их?
Задача ещё не решена.
Других решений пока нет …