OpenCV kullanarak herhangi bir Kinect kullanmadan, verili bir veri kümesiyle çalışıyorum. Ve ben verilen derinlik verisini RGB karşıtına eşlemek istiyorum (böylece gerçek rengi ve derinliği elde edebilirim)Kinect'in derinlik verilerini RGB rengine nasıl eşlersiniz?
OpenCV ve C++ kullanıyorum ve bir Kinect'e sahip olmadığım için ne yazık ki resmi Kinect API'sinden MapDepthFrameToColorFrame yöntemini kullanamaz. Dünya koordinatları verilen kameraların intrinsics ve distorsiyon katsayıları itibaren
, bu derinliği harita olabilir ve geri RGB here
Vec3f depthToW(int x, int y, float depth){
Vec3f result;
result[0] = (float) (x - depthCX) * depth/depthFX;
result[1] = (float) (y - depthCY) * depth/depthFY;
result[2] = (float) depth;
return result;
}
Vec2i wToRGB(const Vec3f & point) {
Mat p3d(point);
p3d = extRotation * p3d + extTranslation;
float x = p3d.at<float>(0, 0);
float y = p3d.at<float>(1, 0);
float z = p3d.at<float>(2, 0);
Vec2i result;
result[0] = (int) round((x * rgbFX/z) + rgbCX);
result[1] = (int) round((y * rgbFY/z) + rgbCY);
return result;
}
void map(Mat& rgb, Mat& depth) {
/* intrinsics are focal points and centers of camera */
undistort(rgb, rgb, rgbIntrinsic, rgbDistortion);
undistort(depth, depth, depthIntrinsic, depthDistortion);
Mat color = Mat(depth.size(), CV_8UC3, Scalar(0));
ushort * raw_image_ptr;
for(int y = 0; y < depth.rows; y++) {
raw_image_ptr = depth.ptr<ushort>(y);
for(int x = 0; x < depth.cols; x++) {
if(raw_image_ptr[x] >= 2047 || raw_image_ptr[x] <= 0)
continue;
float depth_value = depthMeters[ raw_image_ptr[x] ];
Vec3f depth_coord = depthToW(y, x, depth_value);
Vec2i rgb_coord = wToRGB(depth_coord);
color.at<Vec3b>(y, x) = rgb.at<Vec3b>(rgb_coord[0], rgb_coord[1]);
}
}
sağlanan algoritmaya göre Ama sonuç yanlış hizalanmış gibi görünüyor. Çevirileri el ile ayarlayamıyorum, çünkü veri kümesi 3 farklı Kinekt'ten elde edildi ve her biri farklı yönde yanlış hizalanmış. Bu noktada yapmalı,
Benim sorum (Derinliği RGB eşleştirilmiş: dağılmayan RGB, Orta: dağılmayan Derinlik, Sağ Sol) Aşağıdaki bunun birini görebiliyordu? Dünyaya ya da dünyaya geri dönüşü RGB'ye yansıtmaya çalışırken bir adımı özledim mi? Stereo kamera ile deneyimleyen herkes benim yanlışlarımı işaret edebilir mi?
Çok şimdiden teşekkür ederiz!
Eğer OpenNI kullanıyor musunuz? –
Ne yazık ki hayır. Sadece OpenCV –
Önerirseniz, verileri Kinect'ten almak için OpenNI kullanmalısınız. OpenNI'da sizin için bunu yapabilecek bir dahili işlev var. –