Easiest/most 可以稳健地检测 OpenCV 的两个对象的并集交集形状
Easiest/most robust to detect shape for OpenCV for Intersection over Union of two objects
我正在尝试通过 post 处理视频来测量我的标记跟踪算法的精度。
我的算法是:在视频流中找到一个打印的平面标记,然后在该位置放置一个虚拟标记。我正在使用 AR。
下面是这样一个视频的两帧:
虚拟标记位于检测到的标记之上
与实际标记有偏移的虚拟标记
我想计算实际标记和虚拟标记的 Intersection over Union / Jaccard Index。对于第一张图片,它会给我 ~98%,第二张会给我 ~1/5%。这将为我的算法提供质量、精确度和效果。
我想用 OpenCV 获取每帧中两个标记的位置和旋转,并计算 Jaccard 指数。正如您所看到的,如果我直接在纸质标记上放置一个虚拟标记,我自己(使用 OpenCV)将很难检测到它们。
我的想法是不要在实际标记的顶部放置一个白色标记,而是放置一个易于检测的 "thing" 具有特定颜色或形状的偏移标记,比如说向右 10 厘米可能是。然后我减去偏移量。所以现在,在最好的情况下,实际标记的位置和旋转与减去偏移量的 "thing" 将相同。
但是我应该使用什么作为易于检测的 "thing"? 我没有足够的 OpenCV 经验来知道我应该使用什么(彩色?)形状.增强可以在视频中的任何时间在实际标记的前面、后面、左边、右边……它应该做两件事:
不妨碍实际标记的检测,如图中所示
本身容易被发现
不胜感激!
假设视觉标记周围有足够的白色背景:
您可以使用彩色圆圈,例如红色、绿色、蓝色和黑色。
使用 opencv 斑点检测 [1] 检测所有斑点并过滤圆形斑点:
查找检测到的斑点的平均颜色值并过滤圆圈的颜色。
或者,您可以为每种颜色过滤整个图像,并对过滤后的图像进行斑点检测。但是这样比较慢。
使用斑点轮廓的矩找到每个斑点的质心(~中心点)。 [2] "Center of multiple blobs in an Image".
现在你有了圆圈的四个像素位置。如果您知道光投影圆的世界坐标,您可以使用 solvePnP 从中获取姿势。
知道正确的世界坐标对你来说很棘手,因为你用光将圆投射到一个表面上。这涉及到一些 3D 几何。您需要了解从相机坐标系到图案投影仪坐标系的转换以及投影仪的投影参数。
我猜你将投影图案作为图像发送到投影仪。我认为您可以将投影仪建模为具有特定相机矩阵(基本上是视野和中心点)的相机。你自然知道投影圆的像素坐标。由此您可以计算 3D space 中的光线(在投影仪坐标系中)。作为起点,请参见 [3]。将 [4] 它们与正确的表面平面(在投影仪坐标系中)相交,可以得到 3D 坐标
投影仪坐标系中的投影圆圈图案。使用您已知的转换将这些转换为相机坐标系。现在使用 opencv solvePnP 来确定投射光标记的姿态。
地表平面如何获得?
如果您的设置是静态的,您可以对所有记录的图像使用视觉标记检测,并使用标记姿势的均值或中值作为表面平面。虽然不确定这对您的评估意味着什么..
[1] https://www.learnopencv.com/blob-detection-using-opencv-python-c/
[2]https://www.learnopencv.com/find-center-of-blob-centroid-using-opencv-cpp-python/
[3] https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
[4]https://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm
我正在尝试通过 post 处理视频来测量我的标记跟踪算法的精度。
我的算法是:在视频流中找到一个打印的平面标记,然后在该位置放置一个虚拟标记。我正在使用 AR。
下面是这样一个视频的两帧:
虚拟标记位于检测到的标记之上
与实际标记有偏移的虚拟标记
我想计算实际标记和虚拟标记的 Intersection over Union / Jaccard Index。对于第一张图片,它会给我 ~98%,第二张会给我 ~1/5%。这将为我的算法提供质量、精确度和效果。
我想用 OpenCV 获取每帧中两个标记的位置和旋转,并计算 Jaccard 指数。正如您所看到的,如果我直接在纸质标记上放置一个虚拟标记,我自己(使用 OpenCV)将很难检测到它们。
我的想法是不要在实际标记的顶部放置一个白色标记,而是放置一个易于检测的 "thing" 具有特定颜色或形状的偏移标记,比如说向右 10 厘米可能是。然后我减去偏移量。所以现在,在最好的情况下,实际标记的位置和旋转与减去偏移量的 "thing" 将相同。
但是我应该使用什么作为易于检测的 "thing"? 我没有足够的 OpenCV 经验来知道我应该使用什么(彩色?)形状.增强可以在视频中的任何时间在实际标记的前面、后面、左边、右边……它应该做两件事:
不妨碍实际标记的检测,如图中所示
本身容易被发现
不胜感激!
假设视觉标记周围有足够的白色背景:
您可以使用彩色圆圈,例如红色、绿色、蓝色和黑色。
使用 opencv 斑点检测 [1] 检测所有斑点并过滤圆形斑点:
查找检测到的斑点的平均颜色值并过滤圆圈的颜色。 或者,您可以为每种颜色过滤整个图像,并对过滤后的图像进行斑点检测。但是这样比较慢。
使用斑点轮廓的矩找到每个斑点的质心(~中心点)。 [2] "Center of multiple blobs in an Image".
现在你有了圆圈的四个像素位置。如果您知道光投影圆的世界坐标,您可以使用 solvePnP 从中获取姿势。 知道正确的世界坐标对你来说很棘手,因为你用光将圆投射到一个表面上。这涉及到一些 3D 几何。您需要了解从相机坐标系到图案投影仪坐标系的转换以及投影仪的投影参数。
我猜你将投影图案作为图像发送到投影仪。我认为您可以将投影仪建模为具有特定相机矩阵(基本上是视野和中心点)的相机。你自然知道投影圆的像素坐标。由此您可以计算 3D space 中的光线(在投影仪坐标系中)。作为起点,请参见 [3]。将 [4] 它们与正确的表面平面(在投影仪坐标系中)相交,可以得到 3D 坐标 投影仪坐标系中的投影圆圈图案。使用您已知的转换将这些转换为相机坐标系。现在使用 opencv solvePnP 来确定投射光标记的姿态。
地表平面如何获得? 如果您的设置是静态的,您可以对所有记录的图像使用视觉标记检测,并使用标记姿势的均值或中值作为表面平面。虽然不确定这对您的评估意味着什么..
[1] https://www.learnopencv.com/blob-detection-using-opencv-python-c/
[2]https://www.learnopencv.com/find-center-of-blob-centroid-using-opencv-cpp-python/
[3] https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
[4]https://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm