2013-06-09 4 views
5

나는 내 측면의 Kinect없이 OpenCV를 사용하여 주어진 데이터 세트로 작업하고 있습니다. 그리고 주어진 깊이 데이터를 RGB에 매핑하고 싶습니다. (실제 색상과 깊이를 얻을 수 있도록)Kinect의 깊이 데이터를 RGB 색상에 어떻게 맵핑합니까?

OpenCV와 C++을 사용하고 있으며 Kinect를 소유하고 있지 않기 때문에 슬프게도 저는 공식 Kinect API에서 MapDepthFrameToColorFrame 메소드를 사용할 수 없습니다. 세계 좌표에 주어진 카메라 '내장 함수 및 왜곡 계수에서

, 나는 깊이를 매핑 할 수 있습니다, 다시 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]); 
     } 
    } 

제공하는 알고리즘을 기반으로하지만, 결과가 잘못 정렬 것으로 보인다. 데이터 세트가 3 개의 다른 Kinect에서 얻어지며 각각 다른 방향으로 정렬이 잘못되어 번역을 수동으로 설정할 수 없습니다. 나는이 시점에서 어떻게해야,

enter image description here

내 질문은 (깊이에 RGB 매핑 : 왜곡되지 않은 RGB, 중동 : 왜곡 깊이, 오른쪽 왼쪽) 아래 그 중 하나를 볼 수 있을까? 세계로 깊이를 투사하거나 RGB로 세상을 다시 투사하는 동안 한 걸음도 놓쳤습니까? 스테레오 카메라를 경험 한 사람이라면 저의 실수를 지적 할 수 있습니까?

미리 감사드립니다.

+0

당신이 OpenNI를 사용하고 있습니까? –

+0

슬프게도 안돼. 오직 OpenCV –

+0

나는 Kinect에서 데이터를 가져 오기 위해 OpenNI를 사용해야한다고 제안합니다. 이것을 할 수있는 OpenNI에는 inbuilt 함수가 있습니다. –

답변

0

OpenCV에는 깊이 스트림을 컬러 비디오 스트림에 정렬하는 기능이 없습니다. 그러나 "Kinect for Windows SDK"에는 MapDepthFrameToColorFrame이라는 이름의 special function이 있다는 것을 알고 있습니다.

예를 들어 코드가 없지만 시작하는 것이 좋은 시점이되기를 바랍니다.

업데이트 : Here is OpenCV (내 코드 아님) 인터페이스가있는 KinectSDK를 사용하여 컬러 이미지를 깊이에 매핑하는 동일한 예입니다.

+0

원본 게시물마다 MapDepthFrameToColorFrame을 사용할 수 없습니다 (데이터 세트는 pgm 및 ppm 이미지이며 kinect는 사용할 수 없습니다). 그리고 슬프게도 내가 찾고있는 것은 NuiImageGetColorPixelCoordinatesFromDepthPixel의 내부 알고리즘입니다. 아무데도 찾을 수 없습니다 (오픈 소스처럼 보이지 않습니다). –

1

스테레오 카메라를 보정하는 것과 같은 방법으로 RGB 데이터로 깊이 센서를 보정해야한다고 가정합니다. OpenCV에는 사용자가 활용할 수있는 몇 가지 기능 (및 자습서)이 있습니다.

이 그것을 수행하는 방법에 대한 논문을 포함

  1. http://www.ros.org/wiki/kinect_calibration/technical
  2. https://github.com/robbeofficial/KinectCalib
  3. http://www.mathworks.com/matlabcentral/linkexchange/links/2882-kinect-calibration-toolbox 유용 할 수있는 몇 가지 다른 것들.
+0

아, 저는 이미 카메라 내장 함수, 왜곡 및 외인 매개 변수)을 사용하여 다른 사용자가 이미 교정을 수행했습니다. 내 주요한 문제는 정렬 된 것처럼 보이기 때문에 내가 놓친 단계 일 수 있습니다. –

0

솔루션에서 두 카메라 간의 외재를 고려하지 않은 것처럼 보입니다.

0

예, RGB와 깊이 사이의 변환은 고려하지 않았습니다. 그러나이 행렬은 바둑판 모양의 모서리가있는 RGB 및 깊이의 이미지 시퀀스를 전달하는 cvStereoCalibrate() 메서드를 사용하여이 행렬을 계산할 수 있습니다.당신이 OpecvCV 문서에서 찾을 수 세부 : http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#double stereoCalibrate (InputArrayOfArrays의 objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, 크기 imageSize, OutputArray R, OutputArray T, OutputArray E, OutputArray F, TermCriteria 기준 INT 플래그)

그리고이 뒤에있는 모든 방법 아이디어는 다음과 같습니다

컬러 UV < - 색 공간 < - - DtoC 변환 < - 깊이 공간 < - 깊이 정상화 색상 < 정상화 < - 깊이 UV (UC, VC) < - < - ExtrCol * (PC) < - 스테레오 캘리브레이션 MAT < - ExtrDep^-1 * (PD) < - < (UD - CX) * D/FX (vd- CY) * D/년도, D> < - (UD, VD)

는 RGB에 왜곡을 추가하려는 경우, 당신은 단지에있는 단계를 따라야합니다 http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

관련 문제