這類程式不難,要訣就是要「對齊」『深度攝影處理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;
- }
沒有留言:
張貼留言