OpenCV3.0 RGB-D Odometry 평가 프로그램을 Viz를 사용하여 멋지게 표시한다. (Visual Studio 2013, C++, OpenCV3.0, 3차원 점군 처리)

OpenCV3.0 RGB-D Odometry 평가 프로그램


  • OpenCV3.0의 modules에는 rgbd 모듈이 새롭게 추가되고 있다.
  • RGB-D (Direct 방법)에 의한 Odometry 추정 외에도 ICP와 RGB-D ICP가 있습니다.

  • 샘플 에는 친절하게 TUM의 RGB-D Dataset을 이용한 odometry 평가용 프로그램이 있다.
  • Viz를 사용하여 3차원 점군과 카메라의 궤적을 표시해 봅니다.
  • 또한 ICL-NUIM 데이터 세트도 사용되었습니다.

  • Viz를 사용하여 멋지게 표시


  • VizWindow 초기화
  •     viz::Viz3d myWindow("Point Cloud");
        /// Pose of the widget in camera frame
        cv::Affine3d cloud_pose = cv::Affine3d().translate(cv::Vec3d(0.0f, 0.0f, 0.0f));
        /// Pose of the widget in global frame
        cv::Affine3d cloud_pose_global = cloud_pose;
        cv::Affine3d cam_pose;
    
  • 3차원 점군 표시(10프레임마다 초기 프레임으로 변환한 3차원 점군을 표시)
  • 몇 프레임마다 또는 다운 샘플링하여 표시하지 않으면 무거워진다
  •             //10フレームごと変換して表示
                Mat rot = Rts[count](Rect(0, 0, 3, 3)).t();
                Mat tvec = Rts[count](Rect(3, 0, 1, 3)).t();
                if (count % 10 == 0){
                    int downSamplingNum = 4; //e.g. 4
                    Mat image2(image.rows / downSamplingNum, image.cols / downSamplingNum, CV_8UC3);
                    resize(image, image2, image2.size(), 0, 0, INTER_LINEAR);
                    Mat pCloud(image.rows / downSamplingNum, image.cols / downSamplingNum, CV_64FC3);
    
                    for (int y = 0; y < 480; y += downSamplingNum){
                        for (int x = 0; x < 640; x += downSamplingNum){
                            if (depth.at<float>(y, x) < 8.0 && depth.at<float>(y, x) > 0.4){
                                //RGB-D Dataset
                                Mat pmat(1, 3, CV_64F);
                                pmat.at<double>(0, 2) = (double)depth.at<float>(y, x);
                                pmat.at<double>(0, 0) = (x - cx) * pmat.at<double>(0, 2) / fx;
                                pmat.at<double>(0, 1) = (y - cy) * pmat.at<double>(0, 2) / fy;
                                pmat = (pmat)*rot + tvec;
                                Point3d p(pmat);
                                pCloud.at<Point3d>(y / downSamplingNum, x / downSamplingNum) = p;
                                pmat.release();
                            }
                            else{
                                //RGB-D Dataset
                                pCloud.at<Vec3d>(y / downSamplingNum, x / downSamplingNum) = Vec3d(0.f, 0.f, 0.f);
                            }
                        }
                    }
    
                    viz::WCloud wcloud(pCloud, image2);
                    string myWCloudName = "CLOUD" + NumToString(count);
                    myWindow.showWidget(myWCloudName, wcloud, cloud_pose_global);
    
  • 카메라 궤적 표시 (frustum에 이미지를 표시 할 수도 있음)
  • cam_pose = cv::Affine3d(rot.t(), tvec);
                viz::WCameraPosition cpw(0.1); // Coordinate axes
                viz::WCameraPosition cpw_frustum(cv::Matx33d(cameraMatrix), /*image,*/ 0.1, viz::Color::white()); // Camera frustum
                string widgetPoseName = "CPW" + NumToString(count);
                string widgetFrustumName = "CPW_FRUSTUM" + NumToString(count);
                myWindow.showWidget(widgetPoseName, cpw, cam_pose);
                myWindow.showWidget(widgetFrustumName, cpw_frustum, cam_pose);
                myWindow.spinOnce(1, true);
    

    실험 환경


  • Visual Studio 2013
  • OpenCV3.0 (rgbd, viz)
  • PC : intel Core i7-4600 CPU @ 2.1 ~ 2.7GHz 8GB 메모리

  • 실행 준비


  • OpenCV3.0의 도입은 여기
  • OpenCV 3.0 확장 모듈 opencv_contrib 도입 필요

  • modules의 rgbd, viz의 include 파일은 opencv300\build\include 아래에 복사해 두는 것
  • 소스 코드는 여기
  • 데이터 세트 다운로드 ( TUM 데이터 세트 , ICL-NUIM 데이터 세트 )
  • 런타임에 Rgbd, ICP, RgbdICP 중 하나를 인수로 지정합니다. (Properties → Debugging → Command Arguments)

  • TUM 데이터 세트 :RGB-D SLAM 평가용 데이터 세트. 궤적 평가에는 모션 캡처 시스템에 의해 얻은 고정밀 참값이 사용됩니다. ※evaluate_tools를 이용해 RGB와 Depth 프레임의 동기 associations.txt 파일의 생성이 필요.

    ICL-NUIM 데이터 세트 : RGB-D SLAM 평가용 데이터 세트. 궤적뿐만 아니라 3차원 재구축의 평가도 할 수 있다. 데이터 세트는 POV-Ray 시뮬레이션에 의해 생성됩니다.

    결과



    다운 샘플링하지 않고 (downSamplingNum = 1) 표시했다. ICP에서 추정한 TUM 데이터 세트 fr1/xyz의 결과.

  • RGB-D ICP의 정확도가 비교적 좋다. 다음으로 RGB-D(Direct법). ICP는 구조가 명확한 환경이 아니면 작동하지 않습니다.
  • RGB-D가 제일 고속. (RGB-D ~ 30ms, ICP ~ 70ms, RGB-D ICP ~ 100ms)

  • 관련 기사


  • Viz를 이용한 3차원 점군 표시
  • 좋은 웹페이지 즐겨찾기