尊敬的Habr读者,下午好! 这是在Raspberry Pi 3上使用鱼眼镜头的故事的第二部分。可以在
此处找到第一部分。 在本文中,我将讨论如何校准鱼眼镜头,并使用find_object_2d包使用该相机检测对象。 谁在乎,请在猫下。
使用camera_calibration校准鱼眼相机
在这里,我根据ros.org门户上的官方
手册描述校准过程。
要执行校准,我们需要相机校准包。 我们可以使用apt安装它:
sudo apt-get install ros-kinetic-camera-calibration
我们将需要一个棋盘模板。 从ros.org的官方
手册中下载模板并进行打印。 为了方便起见,我将其粘贴在胶合板上:

让我们运行校准程序:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
我们将得到一张照片:

稍微移动模板,然后等待直到在框架中选择了模板(带点的彩色线不会出现在模板上)。


将模板再移到一边。 为了成功执行校准,我们需要在相机前方左右移动模板,以使模板落入相机视场中的所有角度位置(左,右,上,下)。 程序窗口中摄像机图像窗口右侧的是带有三个进度条的注册面板:
- X捕捉相机视野中图案在左右方向(水平)上的移动
- Y捕获相机视野中图案在上/下方向(水平)上的移动
- 大小可捕获模板从相机接近/移走并相对于相机倾斜的情况。
- 斜度固定模板的左右,上和下(斜角)的斜率。
因此,为了成功进行校准,重要的是模板应出现在框架的不同角落,占据整个框架,并且还应向左,向右,向上和向下倾斜。
在Raspberry Pi上校准鱼眼镜头摄像头可能需要一段时间,因此请耐心等待。 我的校准过程花了20分钟。
校准完成后,应激活“校准”按钮(以彩色突出显示):

我们还可以在终端中看到校准结果:

如果您对结果满意,请按COMMIT按钮。 程序窗口将关闭,您将在终端中看到消息“正在将校准数据写入...”。
检查指定文件是否已创建:
ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml
校准完成。 现在,获得的校准数据可用于ROS中的视觉定位和SLAM算法。
使用find_object_2d检测对象
安装
软件包非常简单。 从Ubuntu 16.04中用于ROS Kinetic的apt仓库中安装它:
sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash
运行ROS master和rqt_image_view:
roscore roslaunch usb_cam usb_cam-test.launch
使用以下命令,启动检测器节点:
rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
检测程序窗口打开:

在这里,我们将看到来自摄像机的信息流以及物体特征特征检测的结果。
首先,我们将在我们的设施中进行探测器培训。 将第一个对象放在相机前面:

右键单击窗口中“对象”的左侧面板,将打开“从场景添加对象”选项。 选择此选项,将打开用于添加对象的窗口:

为对象选择最佳位置后,单击“拍摄照片”按钮拍摄对象的照片:

我们需要选择图片中的对象。 使用鼠标光标选择对象:

单击下一步按钮以剪切图片中的对象,然后继续下一步。 裁剪图像后,我们获得在对象处检测到的特征特征的总数。 只需按下“结束”按钮即可将对象添加到训练有素的检测器对象的数据库中。 在这里,我们看到了添加对象的过程的最后一步:

结果,我们在一个物体上训练了探测器。 现在,您可以尝试检测场景中的对象:

让我们将检测到的对象的位置绘制到终端:
rosrun find_object_2d print_objects_detected
输出将如下所示:
Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) ---
让我们列出主题:
rostopic list
列表中出现了两个新主题:/ objects和/ objectsStamped。
我们显示有关检测到的对象的信息:
rostopic echo /objects
layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] ---
在此,第二和第三值(266.0,177.0)表示对象的宽度和高度。 数据字段中的所有其他值表示3x3单应性矩阵(用于计算对象的位置和方向,以及比例和位移值)。
如观察结果所示,find_object_2d在检测纹理较弱或没有纹理(无纹理)的对象方面做得很差。 另外,当检测到与物体成较大角度的物体(如果我们从侧面观察物体)或与物体相距较大距离时,检测器无效。

使用检测器完成工作之后,find_object_2d将为我们提供将添加的对象保存到磁盘的功能。
现在就这些了。 祝大家好运,很快再见!