
ããã«ã¡ã¯ãä»æ¥ã®ããã°æçš¿ã§ã¯ã OpenCVã©ã€ãã©ãªã® 3DèŠèŠåVizã®æ°ããã¢ãžã¥ãŒã«ã®ã¬ãã¥ãŒã«å°å¿µããããšæããŸããç§ã¯åå ããŸããã ããããç§ã¯ããã§èªå·±çŽ¹ä»ãããªããã°ãªããŸãããç§ã®ååã¯ã¢ãããªãŒã»ãã¯ã·ãŒãšãã§ã ãç§ã¯Itseezã§åããŠããŸã ãç§ã¯7幎éOpenCVã©ã€ãã©ãªã䜿çšããŠãããååãšäžç·ã«ãããéçºããéçºããŠããŸãã
3Dããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã¯ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ãšäœã®é¢ä¿ãããã®ã§ããããïŒãŸãããªããã®ãããªã¢ãžã¥ãŒã«ãå¿ èŠãªã®ã§ããããïŒ ãããŠãã³ã³ãã¥ãŒã¿ããžã§ã³ãç»åã§åäœããé åãšããŠèŠããšãããªãã¯æ£ããã§ãããã ããããç§ãã¡ã¯21äžçŽã«çããŠãããã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã®ç¯å²ã¯ãç»åã®åŠçããªããžã§ã¯ãã®å¢çã®åŒ·èª¿ããŸãã¯é¡ã®èªèãã¯ããã«è¶ ããŠããŸãã ç§åŠæè¡ã¯ãå€ããå°ãªãã蚱容ã§ããå質ã§äžæ¬¡å äžçã枬å®ããããšããã§ã«åŠãã§ããŸãã ããã¯ãæ°å¹Žåã«åžå Žã«å®äŸ¡ãªKinectã»ã³ãµãŒãç»å Žããããšã§ä¿é²ãããŸãããããã«ãããåœæã®ç²ŸåºŠãšé床ãåªãããããã®3次å ã«ã©ãŒã¯ã©ãŠãã®åœ¢ã§ã·ãŒã³è¡šçŸãååŸã§ããäžé£ã®ç»åããããŒã¿ã®3Däžçãåæ§ç¯ããããã«ã¯å»ãããšããå¯èœã«ãªããŸããçµ±åããããžã£ã€ãã¹ã³ãŒããšå é床èšã«ããã3Dã®äžçã§ã¢ãã€ã«ããã€ã¹ã®ã«ã¡ã©ã®åããè©äŸ¡ããã¿ã¹ã¯ãå€§å¹ ã«ç°¡çŽ åããããããã£ãŠã·ãŒã³ã®åæ§ç¯ã®ç²ŸåºŠãåäžããŸãã
ããããã¹ãŠãã3DããŒã¿ãæ±ãããŸããŸãªæ¹æ³ãšã¢ã«ãŽãªãºã ã®éçºãä¿ããŸããã 3Dã»ã°ã¡ã³ããŒã·ã§ã³ã3Dãã€ãºãã£ã«ã¿ãªã³ã°ããªããžã§ã¯ãã®3D圢ç¶èªèã3Dé¡èªèã身äœããŒãºã®3Dãã©ããã³ã°ããŸãã¯ãžã§ã¹ãã£èªèçšã®æã Kinect for XBoxãçºå£²ããããšãããã€ã¯ããœããã¯ã²ãŒã éçºè ã«äººäœã®äœçœ®ãå€æããSDKãæäŸããèå³æ·±ãã€ã³ã¿ãŒãã§ã€ã¹ãåããå€æ°ã®ã²ãŒã ãç»å Žããããšãç¥ã£ãŠããŸãã-ããšãã°ãã²ãŒã ãã£ã©ã¯ã¿ãŒãKinectã®åã«ç«ã£ãŠãããã¬ãŒã€ãŒã®åããç¹°ãè¿ãå Žåã ãã®ãããª3Dã¢ã«ãŽãªãºã ã®çµæã¯ãäœããã®åœ¢ã§èŠèŠåããå¿ èŠããããŸãã ãããã¯ã3次å ã®è»è·¡ãåæ§æããããžãªã¡ããªããŸãã¯3Dã§ã®äººéã®æã®èšç®ãããäœçœ®ãªã©ã§ãã ãŸãããã®ãããªã¢ã«ãŽãªãºã ã¯ãããã°ããå¿ èŠããããå€ãã®å Žåãéçºãããã¢ã«ãŽãªãºã ã®åæã®éçšã§äžéããŒã¿ãèŠèŠåããŸãã

OpenCV Vizã§ã«ã¡ã©ãã¹ã衚瀺ããããŸããŸãªæ¹æ³
ãããã£ãŠãéçºãã¯ãã«ã3Dãšãªã¢ã«ç§»è¡ãããšã OpenCVã§3DããŒã¿ãåŠçããã¢ã«ãŽãªãºã ããŸããŸãç»å ŽããŸãã ãããŠããã®ãããªåŸåããããããç§ãã¡ã¯ãã®ããã®äŸ¿å©ãªã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããããã«æ¥ãã§ããŸãã Vizã¢ãžã¥ãŒã«ã¯ããã®æ¹åãžã®æåã®ã¹ãããã§ãã OpenCVã¯åžžã«ãã©ã®ã¢ã«ãŽãªãºã ãšã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã¢ããªã±ãŒã·ã§ã³ãéçºããããã«åºã¥ããŠãéåžžã«äŸ¿å©ãªããŒã¹ãå«ãã©ã€ãã©ãªã§ããã ç»åãšããŒã¿ãæäœããããã«æãé »ç¹ã«äœ¿çšãããã»ãšãã©ãã¹ãŠã®æäœãå«ãŸããŠããããããŸãé·å¹Žã«ããã£ãŠæ éã«éçºããéåžžã«ã³ã³ãã¯ããªå®è£ ãå¯èœãªAPIïŒã³ã³ãããŒãåºæ¬ã¿ã€ããããã³ãããã䜿çšããæäœïŒãå«ãŸããŠãããããæ©èœæ§ã®äž¡æ¹ã®ç¹ã§äŸ¿å©ã§ãéçºè ã®æéãç¯çŽããã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã¡ãœããã Vizãããããã¹ãŠã®èŠä»¶ãæºãããŠããããšãé¡ã£ãŠããŸãã
ãã£ãã¡ãªäººã®ããã«ãç§ã¯ãã®ãããªã§ã¢ãžã¥ãŒã«ã®æ©èœã玹ä»ããŸãã
Viz Philosophy
ãã®ãããªã¢ãžã¥ãŒã«ãäœæãããšããã¢ã€ãã¢ã¯ãéãããæéã®æ¡ä»¶äžã§ãäœããã®èŠèŠèµ°è¡è·é¢æž¬å®ã¢ã«ãŽãªãºã ïŒ vslam ïŒãäœããã®æ¹æ³ã§ãããã°ããªããã°ãªããªãã£ããšãã«ããã®ãããªã¢ãžã¥ãŒã«ãã©ã®ããã«åœ¹ç«ã€ããã©ã®æ©èœãèŠãŠã¿ããããèªåã®èã§æãããšãã«æãã€ããŸããã ãããŠååã¯ããã®ãããªã¢ãžã¥ãŒã«ãæã€ããšã¯å¥åº·ã§ãããšèšã£ãã ãã¹ãŠãéçºã®å§ãŸãã«ã€ãªãã ã Google Summer Of Codeã®åŠçã§ããOzan Tonkalãšäžç·ã«ãå€ããå°ãªããæçããç¶æ ã«ãªããŸããã Vizã®æ¹åã«åãçµãã§ããŸãã
èšèšã®ã¢ã€ãã¢ã¯ããã®ãŠã£ãžã§ããã®äœçœ®ãšæ¹åãæž¡ãã ãã§ãããããã3Dããžã¥ã¢ã©ã€ã¶ãŒã§ã¬ã³ããªã³ã°ã§ãã3次å ãŠã£ãžã§ããã®ã·ã¹ãã ãããã°ãããšããããšã§ãã ããšãã°ãKinectã«ä»å±ãããã€ã³ãã¯ã©ãŠãã¯ãã«ã¡ã©ã®äœçœ®ã«é¢é£ä»ãããã座æšç³»ã«ä¿åãããããšãå€ããèŠèŠåã®ããã«ãã«ã¡ã©ã®ããŸããŸãªäœçœ®ããååŸãããã¹ãŠã®ãã€ã³ãã¯ã©ãŠããäœããã®çš®é¡ã®ã°ããŒãã«åº§æšç³»ã«å€æããå¿ èŠããããããŸãã ãŸããã°ããŒãã«ã·ã¹ãã ã§æ¯åããŒã¿ãåèšç®ããã®ã§ã¯ãªããåã«ãã®ç¹çŸ€ã®äœçœ®ãèšå®ãããšäŸ¿å©ã§ãã ãããã£ãŠãOpenCV Vizã§ã¯ããµããŒããããŠããåãŠã£ãžã§ãããªããžã§ã¯ãã¯ç¬èªã®åº§æšç³»ã§åœ¢æãããã¬ã³ããªã³ã°ããã»ã¹äžã«æ¢ã«ã·ããããã³æ¹åä»ããããŠããŸãã
ãããã1人ã®äººã«ã ãè¯ãèãã¯æãæµ®ãã³ãŸããã å€æããããã«ãç§åŠããŒã¿ãæäœããã³èŠèŠåããããã®VTKã©ã€ãã©ãªãåãã¢ãããŒããå®è£ ããŠããŸãã ãã®ãããã¿ã¹ã¯ã¯ãOpenCVã¹ã¿ã€ã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšããŒã¿æ§é ã䜿çšããŠã VTKã®ãµãã»ããã«å¯Ÿãããªãã©ã·ãŒã©ãããŒãäœæããå°æ¥ãã®ã»ãããæ¡åŒµããæ©èœãæã€åºæ¬çãªãŠã£ãžã§ããã®ã»ãããäœæããããšã«èŠçŽãããŸããã 説æã«å ããŠãVTKã¯ã¯ãã¹ãã©ãããã©ãŒã ã®èŠä»¶ãæºãããŠãããããããã䜿çšãã決å®ã¯ã»ãŒå³åº§ã«éžæãããŸããã VTKã®äŸåé¢ä¿ã«ããå€å°ã®äžäŸ¿ãã¯ãå°æ¥ã®äœ¿ãããããšæ¡åŒµæ§ã«ãã£ãŠçžæ®ºããã以äžã®ãã®ã ãšæããŸãã
Vizã§ã®ãªããžã§ã¯ãã®äœçœ®ã®è¡šçŸ
ãŠãŒã¯ãªãã空éã®äœçœ®ã¯ãå転ãšå¹³è¡ç§»åã«ãã£ãŠèšå®ãããŸãã å転ã¯ãå転è¡åãå転ãã¯ãã«ïŒ ãããªã²ã¹ãã¯ãã« ïŒããŸãã¯ã¯ã©ãŒã¿ããªã³ãšããŠè¡šãããšãã§ããŸãã å€æã¯3次å ã®ãã¯ãã«ã§ãã å転ãšå¹³è¡ç§»åã¯ãå¥ã ã®å€æ°ã«ä¿åããããæ¡åŒµããã4x4ã¢ãã£ã³å€æè¡åã«çž«ãä»ããããšãã§ããŸãã å®éããã®æ¹æ³ã¯äœ¿ããããã®ããã«ææ¡ãããŠããŸãã ããã...ãç§ã«ãšã£ãŠã䟿å©ã§ãïŒããšèšããŸããããªããžã§ã¯ããã¬ã³ããªã³ã°ãããšãã«ãã®ãããªãããªãã¯ã¹ãäœæãããã³ã«ïŒããããŠããªãã¯åæããŸããããã®åœ¢åŒã§ããŒãºãäœæããŠæäœããããã®äŸ¿å©ãªæ段ãæäŸããªãå Žåã®ã¿ã§ãã ãã®ããŒã«ã¯ãç¹å¥ã«äœæãããcv :: Affine3dã¯ã©ã¹ã§ããã¡ãªã¿ã«ãèŠèŠåã«å ããŠããªãã¡ããªãŒã¢ã«ãŽãªãºã ã®éçºã«äœ¿çšããããšããå§ãããŸãã ã¯ããåå æ°æ奜家ã¯ç§ã«ç³ãæããããšãã§ããŸãã å°æ¥çã«ã¯ãããããµããŒãããäºå®ãããããšãæ£åœåããŸãã
ããã§ã¯ãå®çŸ©ãäžããŸãããã Vizã®åãªããžã§ã¯ãã®äœçœ®ã¯ããªããžã§ã¯ãã«é¢é£ä»ããããŠãããŠãŒã¯ãªãã座æšç³»ããç¹å®ã®ã°ããŒãã«ãŠãŒã¯ãªãã座æšç³»ãžã®å€æã§ãã å®éã«ã¯ãå€æãšã¯äœã§ãããäœãå€æãããŠãããã«ã€ããŠãããŸããŸãªåæããããŸãã ãã®å Žåããªããžã§ã¯ãã®åº§æšç³»ããã°ããŒãã«åº§æšç³»ãžã®ãã€ã³ãã®å€æïŒãã€ã³ã転éïŒãæå³ããŸãã ããªãã¡ïŒ

ããã§ãP G ãP Oã¯ã°ããŒãã«åº§æšç³»ããã³ãªããžã§ã¯ãã®åº§æšç³»ã®ãã€ã³ãã®åº§æšãMã¯ãªããžã§ã¯ãã®å€æè¡åãŸãã¯ããŒãºã§ãã ãªããžã§ã¯ãã®ããŒãºã圢æããæ¹æ³ãèŠãŠã¿ãŸãããã
// cv::Vec3d x_axis, y_axis, z_axis, origin; cv::Affine3d pose = cv::makeTransformToGlobal(x_axis, y_axis, z_axis, origin); // cv::Vec3d position, view_direction, y_direction; Affine3d pose = makeCameraPose(position, view_direction, y_direction); // , Affine3d pose1; Affine3d pose2 = Affine3d::Identity(); // cv::Matx33d R; cv::Vec3d t; Affine3d pose = Affine3d(R, t); // double rotation[9]; double translation[3]; Affine3d pose = Affine3d(cv::Matx33d(rotation), cv::Vec3d(translation));
ãŸãã¯ãèŠèŠçãªãªãã¡ããªã¢ã«ãŽãªãºã ãæ¢ã«éçºããŠãããããã°ã©ã ã«ã¯ãã§ã«ãããã®å€æè¡åãcv :: Matå ã«æ ŒçŽãããŠããŸããïŒ æ¬¡ã«ãæ°ãã圢åŒã®ããŒãºãç°¡åã«ååŸã§ããŸãã
// 4x4 43 cv::Mat pose_in_old_format; Affine3d pose = Affine3d(pose_in_old_format); // 33 cv::Mat R, t; Affine3d pose = Affine3d(R, translation); // cv::Vec3d rotation_vector: Affine3d pose = Affine3d(rotation_vector, translation);
ãã®ã¯ã©ã¹ã§ã¯ãæ§ç¯ã«å ããŠãããŒãºãæäœãã3次å ã®ãã¯ãã«ãšãã€ã³ãã«é©çšããããšãã§ããŸãã äŸïŒ
// 90 Oy 5 Ox. Affine3d pose = Affine3d().rotate(Vec3d(0, CV_PI/2, 0,)).translate(Vec3d(5, 0, 0)); // cv::Vec3d a_vector; cv::Point3d a_point; cv::Vec3d transformed_vector = pose * a_vector; cv::Vec3d transformed_point = pose * a_point; // Affine3d camera1_to_global, camera2_to_global; Affine3d camera1_to_camera2 = camera2_to_global.inv() * camera1_to_global
ããã¯æ¬¡ã®ããã«èªãå¿ èŠããããŸãïŒã«ã¡ã©1ã®åº§æšç³»ã®å³åŽã®ãã€ã³ããä¹ç®ããå Žåãæåã®ïŒå³ïŒå€æåŸã«ã°ããŒãã«ã·ã¹ãã ã®ãã€ã³ããååŸããã°ããŒãã«ã·ã¹ãã ããå€æãå転ããã«ã¡ã©2ã®åº§æšç³»ã«è»¢éããŸã ã«ã¡ã©2ã®åº§æšç³»ã«å¯Ÿããã«ã¡ã©1ã®å§¿å¢ãååŸããŸãã
// double distance = cv::norm((cam2_to_global.inv() * cam1_to_global).translation()); double rotation_angle = cv::norm((cam2_to_global.inv() * cam1_to_global).rvec());
ããã«ã€ããŠã¯ãããããããã®ã¯ã©ã¹ã®å¯èœæ§ãžã®é 足ãå®äºããå¿ èŠããããŸãã 誰ãæ°ã«å ¥ã£ãã®ããããªãã®ã¢ã«ãŽãªãºã ã§ããã䜿çšããããšããå§ãããŸã ã³ãŒãã¯ã³ã³ãã¯ãã§èªã¿ãããã§ãã cv :: Affine3dã€ã³ã¹ã¿ã³ã¹ãã¹ã¿ãã¯ã«å²ãåœãŠããããã¹ãŠã®ã¡ãœãããã€ã³ã©ã€ã³ã¡ãœããã§ãããšããäºå®ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããå¯èœæ§ãéããŸãã
Vizã«ããå¯èŠå
ã¬ã³ããªã³ã°ãæ åœããæãéèŠãªã¯ã©ã¹ã¯ãcv :: viz :: Viz3dãšåŒã°ããŸãã ãã®ã¯ã©ã¹ã¯ããŠã£ã³ããŠã®äœæããŠã£ã³ããŠã®åæåããŠã£ãžã§ããã®è¡šç€ºããŠãŒã¶ãŒå ¥åã®ç®¡çãšåŠçãè¡ããŸãã 次ã®ããã«äœ¿çšã§ããŸãã
Viz3d viz1(âmywindowâ); // mywindow ... ... viz1.spin(); // ; ,
OpenCVã®ã»ãšãã©ãã¹ãŠã®é«ã¬ãã«æ©èœãšåæ§ã«ããã®ã¯ã©ã¹ã¯åºæ¬çã«å éšå®è£ ãžã®ãªã³ã¯ãã«ãŠã³ãããã¹ããŒããã€ã³ã¿ãŒã§ãããããå éšããŒã¿ããŒã¹ããèªç±ã«ã³ããŒãŸãã¯ååã§ååŸã§ããŸãã
Viz3d viz2 = viz1; Viz3d viz3 = cv::viz::getWindowByName(âmywindowâ): Viz3d viz4(âmywindowâ);
èŠæ±ãããååã®ãŠã£ã³ããŠãæ¢ã«ååšããå Žåãçµæã®Viz3dã€ã³ã¹ã¿ã³ã¹ã¯ããããã€ã³ãããŸããããã§ãªãå Žåããã®ååã®æ°ãããŠã£ã³ããŠãäœæããã³ç»é²ãããŸãã ããã¯ãã¢ã«ãŽãªãºã ã®ãããã°ãç°¡çŽ åããããã«è¡ãããŸã-ã©ããã«äœãã衚瀺ããå¿ èŠããããã³ã«ããŠã£ã³ããŠãåŒã³åºãã¹ã¿ãã¯ã®æ·±ãã«æž¡ãå¿ èŠããªããªããŸããã mainïŒïŒé¢æ°ã®å é ã§ãŠã£ã³ããŠãéããã³ãŒãå ã®ä»»æã®å Žæããååã§ã¢ã¯ã»ã¹ããã ãã§ååã§ãã ãã®èãæ¹ã¯ãOpenCVã®å®çžŸã®ããcv :: imshowïŒwindow_nameãimageïŒé¢æ°ããç¶æ¿ãããŠãããã³ãŒãã®ä»»æã®å Žæã«ããååä»ããŠã£ã³ããŠã«ç»åã衚瀺ããããšãã§ããŸãã
ãŠã£ãžã§ããã·ã¹ãã
åè¿°ã®ããã«ããŠã£ãžã§ããã·ã¹ãã ã¯ããŸããŸãªããŒã¿ã®ã¬ã³ããªã³ã°ã«äœ¿çšãããŸãã åãŠã£ãžã§ããã«ã¯ããã€ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããå éšããŒã¿ã管çããããã®ã¡ãœããããããŸãã åãŠã£ãžã§ããã¯ãç¬èªã®åº§æšç³»ã§åœ¢æãããŸãã äŸïŒ
// WLine line(Point3d(0.0, 0.0, 0.0), Point3d(1.0, 1.0, 1.0), Color::apricot()); // WCube cube(Point3d(-1.0, -1.0, -1.0), Point3d(1.0, 1.0, 1.0), true, Color::pink());
ã芧ã®ãšãããä»»æã®ç·ãæå®ã§ããŸãããç«æ¹äœã®å Žåãäœçœ®ã®ã¿ãèšå®ã§ãã座æšè»žã«å¯Ÿããæ¹åã¯èšå®ã§ããŸããã ãã ããããã¯å¶éã§ã¯ãªããVizã®ã¹ã¿ã€ã«ã§èããããšãæããŠãããæ©èœã§ãã åã«èª¬æããããã«ãã¬ã³ããªã³ã°æã«ã¯ãã°ããŒãã«åº§æšç³»ã§ãŠã£ãžã§ããã®ããŒãºãèšå®ã§ããŸãã ãããã£ãŠã座æšç³»ã«åçŽãªã³ã³ã¹ãã©ã¯ã¿ã䜿çšããŠãŠã£ãžã§ãããäœæããŸããããšãã°ããã®æ¹æ³ã§ãã¥ãŒãã®å¯žæ³ãèšå®ããŸãã ãããŠãã¬ã³ããªã³ã°æã«ã°ããŒãã«ã«é 眮ããŠæ¹åä»ããŸãã
// (1.0, 1.0, 1.0) 3 Vec3d rvec = Vec3d(1.0, 1.0, 1.0) * (3.0/cv::norm(Vec3d(1.0, 1.0, 1.0)); Viz3d viz(âtest1â); viz.showWidget(âcooâ, WCoordinateSystem()); viz.showWidget(âcubeâ, cube, Affine3d(rvec, Vec3d::all(0))); viz.spin();
çµæã¯æ¬¡ã®ãšããã§ãã

ã芧ã®ãšãããã¬ã³ããªã³ã°ã¯Viz3d :: showWidgetïŒïŒã¡ãœããã®åŒã³åºããä»ããŠè¡ããããªããžã§ã¯ãã®æåååãäœæããããŠã£ãžã§ããã®ã€ã³ã¹ã¿ã³ã¹ãã°ããŒãã«åº§æšç³»ã§ã®äœçœ®ãæž¡ããŸãã 3Dã·ãŒã³ã§ãŠã£ãžã§ãããååã§è¿œå ãåé€ãæŽæ°ã§ããããã«ãæåååãå¿ èŠã§ãã ãã®ååã®ãŠã£ãžã§ãããæ¢ã«ååšããå Žåãåé€ãããŠæ°ãããŠã£ãžã§ããã«çœ®ãæããããŸãã
Vizã¯ãç«æ¹äœãšç·ã«å ããŠãçäœãåæ±ãå¹³é¢ã2Dåã3Dãš2Dã®åçãšããã¹ããããŸããŸãªçš®é¡ã®ãã¹ãã«ã¡ã©ã®äœçœ®ããããŠãã¡ãããç¹çŸ€ãšã¡ãã·ã¥ïŒç¡è²ãè²ä»ãããŸãã¯ãã¯ã¹ãã£ïŒã ãã®å€ãã®ãŠã£ãžã§ããã¯æçµçãªãã®ã§ã¯ãªããæ¡åŒµãããŸãã ããã«ãã«ã¹ã¿ã ãŠã£ãžã§ãããäœæããå¯èœæ§ããããŸãããããã«ã€ããŠã¯å¥ã®æ©äŒã«äœæããŸãã ãã®æ©èœã«èå³ãããå Žåã¯ã ãã¡ãã®ãã¥ãŒããªã¢ã«ããèªã¿ãã ããã 次ã«ãç¹çŸ€ãæãæ¹æ³ã®å¥ã®äŸãèŠãŠã¿ãŸãããã
// . CV_32FC3 cv::Mat cloud = cv::viz::readCloud(âdragon.plyâ); // cv::Mat colors(cloud.size(), CV_8UC3); theRNG().fill(colors, RNG::UNIFORM, 50, 255); // NAN - float qnan = std::numeric_limits<float>::quiet_NaN(); cv::Mat masked_cloud = cloud.clone(); for(int i = 0; i < cloud.total(); ++i) if ( i % 16 != 0) masked_cloud.at<Vec3f>(i) = Vec3f(qnan, qnan, qnan); Viz3d viz(âdragonsâ); viz.showWidget(âcooâ, WCoordinateSystem()); // viz.showWidget(âredâ, WCloud(cloud, Color::red()), Affine3d().translate(Vec3d(-1.0, 0.0, 0.0))); // viz.showWidget(âcoloredâ, WCloud(cloud, colors), Affine3d().translate(Vec3d(+1.0, 0.0, 0.0))); // viz.showWidget(âmaskedâ, WCloud(masked_cloud, colors), Affine3d::Identity()); // A , viz.showWidget(âpaintedâ, WPaintedCloud(cloud), Affine3d().translate(Vec3d(+2.0, 0.0, 0.0))); viz.spin();
ãã®ã³ãŒãã®çµæïŒ

å©çšå¯èœãªãŠã£ãžã§ããã®è©³çŽ°ã«ã€ããŠã¯ã ããã¥ã¡ã³ããåç §ããŠãã ãã ã
åçã«å€åããã·ãŒã³
å€ãã®å ŽåããŠãŒã¶ãŒããªããžã§ã¯ãã衚瀺ã§ããããã«ãªããžã§ã¯ãã衚瀺ããã ãã§ã¯äžååã§ããããã€ããã¯ã¹ãæäŸããå¿ èŠããããŸãã ãªããžã§ã¯ãã¯ç§»åããããå±æ§ãå€æŽãããã§ããŸãã Kinectã§ãããªã¹ããªãŒã ãããå Žåããããããã€ã³ãã¯ã©ãŠãvide®ãåçã§ããŸãã ãããè¡ãã«ã¯ã次ã®ããšãå®è¡ã§ããŸãã
cv::VideoCapture capture(CV_CAP_OPENNI) Viz3d viz(âdynamicâ); //... ... // viz.setViewerPose(Affine3d().translate(1.0, 0.0, 0.0)); while(!viz.wasStopped()) { //... ... // , // , Kinect // , capture.grab(); capture.retrieve(color, CV_CAP_OPENNI_BGR_IMAGE); capture.retrieve(depth, CV_CAP_OPENNI_DEPTH_MAP); Mat cloud = computeCloud(depth); Mat display = normalizeDepth(depth); viz.showWidget("cloud", WCloud(cloud, color)); viz.showWidget("image", WImageOverlay(display, Rect(0, 0, 240, 160))); // 30 viz.spinOnce(30 /*ms*/, true /*force_redraw*/)); }
ãã®ãµã€ã¯ã«ã¯ããŠãŒã¶ãŒããŠã£ã³ããŠãéãããŸã§å®è¡ãããŸãã åæã«ãã«ãŒãã®åå埩ã§ãå€ãã¯ã©ãŠãã®ãŠã£ãžã§ããã¯æ°ããã¯ã©ãŠãã®æ°ãããŠã£ãžã§ããã«çœ®ãæããããŸãã
å¶åŸ¡ã€ã³ã¿ãŒãã§ãŒã¹
çŸæç¹ã§ã¯ãã«ã¡ã©ã³ã³ãããŒã«ã¯ãããããã©ãã¯ããŒã«ã«ã¡ã©ã¹ã¿ã€ã«ã§äœæãããŠãããããŸããŸãª3Dãªããžã§ã¯ãã衚瀺ããã®ã«äŸ¿å©ã§ãã ã«ã¡ã©ã®åã«ããã®ã«ã¡ã©ãããŠã¹ãšãšãã«å転ãã3Dã®ãã€ã³ããããããšãæ³åããŠãã ããã ããŠã¹ã®ã¹ã¯ããŒã©ãŒã¯ããã®ãã€ã³ããã/ã«è¿ã¥ããŸãã shift / ctrlãã¿ã³ãšããŠã¹ã䜿çšããŠã3Dã¯ãŒã«ãã§ãã®å転ç¹ã移åã§ããŸãã å°æ¥çã«ã¯ã倧ããªã¹ããŒã¹ãããã²ãŒãããããã®ããªãŒãã©ã€ã¢ãŒããå®è£ ããäºå®ã§ãã ãŸããVizã®å®è¡äžã«ãHãããããã¿ã³ãæŒããŠãã¹ã¯ãªãŒã³ã·ã§ããã®ä¿åããã¢ãã°ãªãã¹ãã¬ãªã¢ãŒãã®æå¹åãŸã§ãã³ã³ãœãŒã«ã«å°å·ãããŠããä»ã®ãããããŒãæ©èœã«é¢ããæ å ±ãèªãããšããå§ãããŸãã
OpenCV Vizã¢ãžã¥ãŒã«ã®æ§ç¯æ¹æ³
ãããŠæåŸã«ããã®ããã¹ããèªãã åŸããã®ã¢ãžã¥ãŒã«ã®äœ¿çšãéå§ããã人ã®ããã«ããã®ã»ã¯ã·ã§ã³ãæå³ãããŠããŸãã Vizã¯ãWindowsãLinuxãMacã®3ã€ã®äž»èŠãªPCãã©ãããã©ãŒã ãã¹ãŠã§äœ¿çšã§ããŸãã VTKãã€ã³ã¹ããŒã«ããVTKãµããŒãã䜿çšããŠOpenCVãã³ã³ãã€ã«ããå¿ èŠããããŸãã Vizã¢ãžã¥ãŒã«ãå«ãOpenCVèªäœã¯ã2.4ããã³masterãã©ã³ãã®GitHubãªããžããªhttps://github.com/Itseez/opencvããã®ã¿ããŠã³ããŒãã§ããŸãã ã ãããåœä»€ïŒ
1. VTKã€ã³ã¹ããŒã«
Linuxã§ã¯ãæãç°¡åãªè§£æ±ºçã¯ãapt-get install libvtk5-devã³ãã³ãã䜿çšããŠaptãªããžããªããVTKãã€ã³ã¹ããŒã«ããããšã§ãã Windowsã®å Žåãéçºè ã®ãµã€ãããVTKãããŠã³ããŒãããå¿ èŠããããŸããæé©ãªããŒãžã§ã³ã¯5.10ã§ããVisualStudioçšã®CMakeãããžã§ã¯ããçæãããªãªãŒã¹ããã³ãããã°æ§æã§ã³ã³ãã€ã«ããŸãã CMake BUILD_SHARED_LIBSã®ãã§ãã¯ãå€ãããšããå§ãããŸããããã«ãããVTKéçã©ã€ãã©ãªã®ã³ã³ãã€ã«ãè¡ãããŸãã ãã®å Žåãã³ã³ãã€ã«åŸãäŸåé¢ä¿ã®ãªãOpenCV Vizã¢ãžã¥ãŒã«ã®ãµã€ãºã¯çŽ10 MBã«ãªããŸãã
Macã®å ŽåãOSXããŒãžã§ã³10.8以åã§ã¯ããã¹ãŠã®ããŒãžã§ã³ã®VTKãé©åã§ã; 10.9 Mavericksã®å Žåãå ¬åŒãªããžããªgithub.com/Kitware/VTK.gitããVTK 6.2ãã³ã³ãã€ã«ã§ããŸãã ãã®ããã°æçš¿ã®å·çæç¹ã§ã¯ããªãªãŒã¹6.2ã¯ãããŸããã§ããã Macã§ã¯ãCMakeã䜿çšããŠXcodeçšã®ãããžã§ã¯ããçæãããªãªãŒã¹ããã³ãããã°æ§æã§éçã©ã€ãã©ãªããã«ãããããšããå§ãããŸãã
2. VTKã䜿çšããOpenCVã®ã³ã³ãã€ã«
ãã®ã¹ãããã¯ããç°¡åã§é«éã§ãã Linuxçšã®ã³ãã³ããæäŸããŸããWindowsã§ããã¹ãŠã¯ããã»ã©å€ãããŸãã
- git clone github.com/Itseez/opencv.git
- [ãªãã·ã§ã³] git checkout -b 2.4 origin / 2.4
- mkdirãã«ã&& cdãã«ã
- cmake -DWITH_VTK = ON -DVTK_DIR = <VTKãã«ããã£ã¬ã¯ããªãžã®ãã¹> ../opencv
apt-get installã§VTKãã€ã³ã¹ããŒã«ããå ŽåãVTKãžã®ãã¹ãæå®ããå¿ èŠã¯ãããŸãã-CMakeã«ãã£ãŠèªåçã«æ€åºãããŸãã 次ã«ãCMakeã³ã³ãœãŒã«ã®ãã°ã§ã圌ãVTKãèŠã€ããŠæ¥ç¶ããããšã確èªããå¿ èŠããããŸãã ãŸããéäºææ§ã¯å ±åããŸããã§ããã ããšãã°ãOpenCVãQt5ãµããŒãä»ãã§ã³ã³ãã€ã«ããVTKãQt4ã§ãã«ããããŠããå ŽåãVTKãšãªã³ã¯ãããšãmainïŒïŒé¢æ°ã«å ¥ãåã®åæå段éã§ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã 解決çã¯1ã€éžæããããšã§ãã ãŸãã¯ãVake for CMakeã®ãã§ãã¯ããã¯ã¹ããªãã«ããŠãQt4ãªãã§VTKãã³ã³ãã€ã«ããŸãã ãŸãã¯ãVTK 6.1以éã䜿çšããŠãQt5ãµããŒãã§ãã«ãããŸãã æåŸã«ãOpenCVããã«ãããã«ã¯ãmake -j 6ãå®è¡ããŸã
3.ããã¹ãã®èµ·åïŒãªãã·ã§ã³ïŒ
ãã®ãªããžããªãgithub.com/Itseez/opencv_extra.gitããããŠã³ããŒãããããšããå§ãããŸããç°å¢å€æ°OPENCV_TEST_DATA_PATHã«opencv_extra / testdataãžã®ãã¹ãèšè¿°ããŸãã OpenCVã®ãã«ããã£ã¬ã¯ããªããopencv_test_vizãã¡ã€ã«ãå®è¡ããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®ã¢ãžã¥ãŒã«ã®çŸåšã®ãã¹ãŠã®æ©èœã«æ £ããããšãã§ãããã®ãœãŒã¹ã䜿çšããŠAPIãåŠç¿ã§ããŸãã
ãããã«
ããã§ãçµè«ã«éããŸããã é¢çœãã£ããšæããŸãã ãã®æçš¿ã§ã¯ãç§ã®èŠç¹ããèŠãäž»ãªåŸåãã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã§çŸåšã©ã®ããã«èŠ³å¯ãããŠãããããããŠOpenCVã©ã€ãã©ãªãæ代ãšãšãã«åããŠããããšã瀺ãããã£ãã®ã§ãã ãããŠãOpenCVã§ã¯ã3Dã®äžçã§åãããã®ã¢ã«ãŽãªãºã ãç»å ŽããŸãã Google Summer of Codeã®åŠçã®å©ããåããŠéçºããããããŒã¿ããŒã¹ã䜿çšããŠæè¬ããŠãããŠãŒã¶ãŒããOpenCVã§ãã®ãããªã¢ã«ãŽãªãºã ã®äœæãšéçºã«åå ããŸãã
ãŸãããã®éçºããŒã«ããŸãã¯ãã®åéã®ç 究ã«ãèå³ããããŸããã ãšããã§ãOpenCVã®åæ§ã®éçºããªãŒããããå Žåã¯ã倧æè¿ã§ãïŒ GitHubãä»ããŠãã«ãªã¯ãšã¹ããåãå ¥ããŸãã æé ã¯ãã¡ãã«æ²èŒãããŠããŸã ã æ°ããããŸãæ©èœããã¢ãããŒããèŠãããšãã§ããŠããããã§ã:-)
ãããŠãçŸåšå¿ èŠãªåºæ¬çãªåºç€ã¯äœæãããŠããŸãããå°æ¥çã«ã¯æ°ããæ©èœãVizã«è¿œå ããããšæããŸãã ããšãã°ã人éã®æã®éªšæ Œãšãã®èŠèŠåã®ã¢ãã«ã ãŸãã¯ãPTAMãªã©ã®ã¢ã«ãŽãªãºã ããã®3Däžçå°å³ã ãŸãã¯ããããããããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãã§ãã¢ãã€ã«ããã€ã¹ããã¢ã«ãŽãªãºã ããããã°ãããšãã«ãèŠèŠåã®ããã«ããŒã¿ãéä¿¡ã§ããããã«ããŸãã èå³æ·±ãå Žåã¯ã次ã®ããã°æçš¿ã§ãICPãKinect Fusionãªã©ã®ã¢ã«ãŽãªãºã ãšãVizã䜿çšããŠãããã°ããã³èŠèŠåããæ¹æ³ã«ã€ããŠèª¬æã§ããŸãã
ãããŠæåŸãŸã§èªãã 人ã®ããã«-ããŒãã¹ã ããã«ãPCLã©ã€ãã©ãªã§ã®Kinect Fusionã®å®è£ ã®æé©åããã軜éã®ãªã¡ã€ã¯ããããŸãã