1. 程式人生 > >基於openCV和ZED的測距

基於openCV和ZED的測距

第一次寫部落格,寫的不好請見諒。 配置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模式獲得的影象最好,最準確,但對電腦的要求也高。 1

2