天天看点

基于openCV和ZED的测距

基于openCV和ZED的测距

代码下载:https://download.csdn.net/download/weixin_40476456/10782808

第一次写博客,写的不好请见谅。

配置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模式获得的图像最好,最准确,但对电脑的要求也高。

基于openCV和ZED的测距
基于openCV和ZED的测距