基於openCV和ZED的測距
阿新 • • 發佈:2018-12-21
第一次寫部落格,寫的不好請見諒。 配置opencv和zed sdk的教程很多,這裡就不說了。 開發環境:visual studio 2017 實現的功能很簡單,就是滑鼠選取目標,得到左攝像頭和目標的距離,程式碼也很簡單,反正就是這麼簡單的實現了,不得不說zed相機真的太強大了,等我的TX2到了,一定很好玩。 主要程式碼: 1.設定引數:
sl::InitParameters param; param.camera_fps = 30; param.depth_mode = sl::DEPTH_MODE_PERFORMANCE;//PERFORMANCE適合近距離測距,超出5米請用ULTRA模式,當然電腦要帶得動。 param.coordinate_units = sl::UNIT_METER;//單位:米
2.獲取資料
zed.grab(); zed.retrieveImage(img_zed, VIEW_LEFT);//左邊相機影象 img_cv = cv::Mat(img_zed.getHeight(), img_zed.getWidth(), CV_8UC4, img_zed.getPtr<sl::uchar1>(MEM_CPU)); zed.retrieveImage(img_zed_depth, VIEW_DEPTH);//深度矩陣儲存32位浮點值,其表示每個(X,Y)畫素的深度(Z) //預設情況下,深度值以毫米表示。可以使用更改單位InitParameters::coordinate_units。高階使用者可以使用CPU記憶體(預設)或GPU記憶體中的影象,深度和點雲檢索retrieveMeasure(*, *, MEM_GPU)。 img_cv_depth = cv::Mat(img_zed_depth.getHeight(), img_zed_depth.getWidth(), CV_8UC4, img_zed_depth.getPtr<sl::uchar1>(MEM_CPU)); zed.retrieveMeasure(Point_3D, MEASURE_XYZRGBA);//選擇從 CPU中 獲得資料 cv::putText(img_cv, text, cv::Point(20, 30), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0));//將距離顯示在影象上 cv::circle(img_cv, mouse_point, 10, cv::Scalar(255, 0, 0),3); cv::imshow("img_cv", img_cv); //cv::imshow("depth", img_cv_depth); cv::waitKey(30);
3.滑鼠選取目標操作
sl::float4 point3D;//點雲圖資料 //點雲將其資料儲存在4個通道上,每個通道使用32位浮點數。 //最後一個浮點數用於儲存顏色資訊,其中R,G,B和alpha通道(4 x 8位)連線成一個32位浮點數 switch (EVENT) { case cv::EVENT_LBUTTONDOWN: { img_zed_depth.getValue(x, y, &point3D); Point_3D.getValue(x, y, &point3D); //float _x = point3D.x; //float _y = point3D.y; //float _z = point3D.z; //float color = point3D.w; float distance= sqrt(point3D.x*point3D.x + point3D.y*point3D.y + point3D.z*point3D.z); text = "distance: " + std::to_string(distance) + " m"; } break; default:break; }
效果如下: 測了幾次,誤差在5%以內,用ULTRA模式獲得的影象最好,最準確,但對電腦的要求也高。