這類程式不難,要訣就是要「對齊」『深度攝影處理C++ realsense2加上影格對齊align功能』https://youtu.be/GP88KJzUxgY
柴犬3D ply圖檔點雲擷取realsense C++ opencv程式。relsense/ Kinect之類的深度攝影機原來是可以這樣用,程式產生的點雲ply圖檔用MeshLab自由軟體開啟,效果超乎意料之外的好,再多加些程式設計自製的3D Scanner軟體就快完成了。
//本程式測試於D435i #include <librealsense2/rs.hpp> #include <librealsense2/rs_advanced_mode.hpp>//進階設定 #include <opencv2/opencv.hpp> #include <iostream> #include <fstream> using namespace std; using namespace cv; using namespace rs2; using namespace rs400;//進階設定 int main() try { cout << "存點雲到point_cloud.ply\n"; colorizer color_map(3); //0 - Jet, 1 - Classic 2 - WhiteToBlack 3 - BlackToWhite 4 - Bio 5 - Cold //6 - Warm 7 - Quantized 8 - Pattern 9 - Hue rs2::align align2(RS2_STREAM_COLOR); pipeline pipe; //多加幾行就能錄製整個深度攝影機的錄製資訊 config cfg; int w = 1280, h = 720, FPS = 30; cfg.enable_record_to_file("test001.bag");//錄製 cfg.enable_stream(RS2_STREAM_COLOR); cfg.enable_stream(RS2_STREAM_DEPTH); cfg.enable_stream(RS2_STREAM_INFRARED, 1, w, h, RS2_FORMAT_Y8, FPS); cfg.enable_stream(RS2_STREAM_INFRARED, 2, w, h, RS2_FORMAT_Y8, FPS); auto profile = pipe.start(cfg); //參考https://github.com/IntelRealSense/librealsense/issues/3067 auto sensor = profile.get_device().first<depth_sensor>(); sensor.set_option(rs2_option::RS2_OPTION_VISUAL_PRESET, rs2_rs400_visual_preset::RS2_RS400_VISUAL_PRESET_HIGH_DENSITY); pointcloud pc; points points; hole_filling_filter holeFilter;//補洞filter while (1) { frameset data = pipe.wait_for_frames();// data.apply_filter(holeFilter);//點雲補洞 data = align2.process(data); frame depth = data.get_depth_frame(); frame color = data.get_color_frame(); if (depth) { points = pc.calculate(depth); pc.map_to(color); Mat pc_mat(720, 1280, CV_64FC3, (void*)points.get_data()); Mat depth_mat(h, w, CV_8UC3, (void*)depth.apply_filter(color_map).get_data()); Mat color_mat(h, w, CV_8UC3, (void*)color.get_data()), color_mat2; // display depth_mat imshow("depth_mat", depth_mat); dilate(depth_mat, depth_mat, 1); erode(depth_mat, depth_mat, 1); threshold(depth_mat, depth_mat, 180, 255, THRESH_BINARY); cvtColor(color_mat, color_mat2, COLOR_RGB2BGR); color_mat2=depth_mat | color_mat2; imshow("color_mat & depth_mat", color_mat2); int k = waitKey(1); if (k == 27) { points.export_to_ply("point_cloud.ply", color); break; } } } fstream ff("point_cloud.ply"); string ss; do{ getline(ff, ss); cout << ss << endl; } while (ss != "end_header"); return 0; } catch (const rs2::error& e) { cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n " << e.what(); return 1; } catch (exception& e) { cerr << e.what(); return 1; }
沒有留言:
張貼留言