Tôi đang làm việc với tập dữ liệu đã cho bằng cách sử dụng OpenCV, không có bất kỳ Kinect nào bên cạnh tôi. Và tôi muốn ánh xạ dữ liệu độ sâu nhất định cho đối tượng RGB của nó (để tôi có thể nhận được màu sắc thực tế và độ sâu)Làm cách nào để ánh xạ dữ liệu độ sâu của Kinect với màu RGB?
Vì tôi đang sử dụng OpenCV và C++, và không sở hữu Kinect, thật đáng buồn là tôi không thể sử dụng phương thức MapDepthFrameToColorFrame từ API Kinect chính thức.
Từ intrinsics camera cho và hệ số méo, tôi có thể lập bản đồ độ sâu với thế giới tọa độ, và trở lại RGB dựa trên các thuật toán cung cấp 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]);
}
}
Nhưng kết quả dường như không thẳng hàng. Tôi không thể thiết lập các bản dịch theo cách thủ công, vì tập dữ liệu thu được từ 3 Kinects khác nhau và mỗi bộ phận đều không được định hướng theo các hướng khác nhau. Bạn có thể thấy một trong đó bên dưới (Trái: biến dạng RGB, Trung: Chiều sâu không bị biến dạng, bên phải: ánh xạ RGB để Depth)
Câu hỏi của tôi là, tôi nên làm gì vào thời điểm này? Tôi đã bỏ lỡ một bước trong khi cố gắng chiếu chiều sâu cho thế giới hoặc thế giới trở lại RGB? Có ai có kinh nghiệm với máy ảnh stereo chỉ ra sai lầm của tôi không?
Cảm ơn bạn rất nhiều trước!
bạn đang sử dụng OpenNI? –
Đáng buồn là không. Chỉ OpenCV –
Tôi đề nghị, bạn nên sử dụng OpenNI để lấy dữ liệu từ Kinect. Có một chức năng sẵn có trong OpenNI có thể làm điều này cho bạn. –