RealSense D415 捕捉乒乓球运动

作者周末到货后做了乒乓球捕捉demo,借用Intel的pointcloud工程框架,先进行深度与RGB相机align,在RGB图像中识别乒乓球,剔除点云坏点,进行球面拟合求球心位置,将像素坐标转为真实坐标,用最小二乘或RANSAC拟合球面,最后测试不同距离精度。

刚好周末415到货了,今天试了试。

做了一个乒乓球捕捉的demo,左边是三维点云(把乒乓球以外的都变成了白色),右边上面是识别出来的球心坐标和球半径,右下是RGB挖出来的乒乓球图像(BGR格式)
左边是三维点云(把乒乓球以外的都变成了白色),右边上面是识别出来的球心坐标和球半径,右下是RGB挖出来的乒乓球图像(BGR格式)


程序框架借用了Intel给的Demo中的pointcloud工程,
先要做深度相机和RGB相机的align

frames = align_to_color.process(frames);

然后在RGB图像中用颜射识别找出乒乓球

// convert realsense data to opencv data
Mat image(Size(w, h), CV_8UC3, (void*)color.get_data(), Mat::AUTO_STEP);
// convert BGR data to HSV 
Mat imgHSV;
cvtColor(image, imgHSV, CV_BGR2HSV);
// track color with threshold in HSV
Mat imgOrange;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgOrange);
// morphology open to remove noise points
Mat element = getStructuringElement(MORPH_RECT, Size(11, 11));
morphologyEx(imgOrange, imgOrange, MORPH_OPEN, element);
// mask
image.setTo(255, ~imgOrange);
//image.copyTo(image, imgOrange);
imshow("color", image);

由此也就可以从深度相机得到乒乓球的点云,但是由于噪声和识别误差的存在,点云中有一些坏点需要剔除

bool mCompare(xyd_t a, xyd_t b)
{
	return a.d < b.d;
}

// given the x,y and depth infos, find the sphere center
std::vector<xyd_t> throwBadData(std::vector<xyd_t> xyds)
{
	// get rid of bad data
	std::sort(xyds.begin(), xyds.end(), mCompare);

	float median = xyds[xyds.size() / 2].d;

	auto iter = xyds.begin();
	while (iter != xyds.end())
	{
		if (((*iter).d > median + 0.05) || ((*iter).d < median - 0.05))
			iter = xyds.erase(iter);
		else
			iter++;
	}
	return xyds;
}

对于剩下的点要进行球面拟合以求出乒乓球的球心位置,但是此时的x,y坐标还是图像的像素值,需要转化为真实世界的坐标,好在intel的工程师对相机已经进行了标定,所有的参数都存在相机里面,通过下面语句调用

rs2_intrinsics intr = frames.get_profile().as<rs2::video_stream_profile>().get_intrinsics(); // Calibration data

有了相机参数,就可以通过相机的成像模型推导出像素对应的坐标,不过在sdk中已经很贴心的有可以直接用的函数了

#include <librealsense2/rsutil.h>
rs2_deproject_pixel_to_point(upoint, &intr, upixel, udist); // 用法可以参考measure那个demo

得到了所有点的真是坐标之后,就可以对球面进行拟合了,可以用最小二乘,也可以用RANSAC。(还有其他一些神奇的方法)
我这次用了参阅了大神@liyuanbhu的最小二乘算法:
https://blog.youkuaiyun.com/liyuanbhu/article/details/80201371

最后测试了一下,距离的精度在据相机50cm左右可以达到2~3mm, 1m距离估计在3-4mm。

### Intel RealSense D415 使用指南 #### 一、硬件准备 为了使用Intel RealSense D415深度相机,需配备相应的计算平台。这台计算机应具备足够的性能以支持实时数据处理;对于涉及深度学习的任务,则建议采用配置有GPU的设备来提升效率[^2]。 #### 二、软件环境搭建 ##### 1. 安装Intel RealSense SDK 遵循官方文档指示完成SDK安装流程,在此过程中将会自动设置好必要的组件如可视化界面Viewer、实例程序Examples以及深度质量检测工具Depth Quality Tool等辅助应用[^1]。 ```bash sudo apt-get update && sudo apt-get install -y intel-realsense-librealsense/dists/stable/main/binary-amd64/Packages ``` ##### 2. 配置其他依赖库 除了RealSense SDK外,还可能需要用到诸如OpenCV这样的图像处理框架来进行视觉算法开发;如果项目涉及到三维空间重建的话则离不开PCL的支持;而对于那些计划利用神经网络实现高级功能(比如物体识别)的研究者来说,提前准备好TensorFlow或是PyTorch也是非常重要的一步。 #### 三、基本操作说明 通过启动`rs-enumerate-devices`命令能够快速查看当前连接的所有兼容型号及其状态信息: ```bash rs-enumerate-devices ``` 而要开启并测试D415的具体工作情况,则可以通过运行预设好的example脚本来达成目的——只需执行如下指令即可调用默认参数下的视频流采集服务,并将其显示于屏幕上供观察之用: ```bash ./examples/save-to-disk/rs-save-to-bag ./output.bag ``` 此外,借助图形化的管理面板——即随同SDK一同分发出来的Intel RealSense Viewer应用程序,用户还可以更加直观便捷地调整各项拍摄选项(像分辨率大小、帧率高低之类的),从而获得最适合自己应用场景的理想效果。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值