使用已知的物体尺寸测量图片中的物体

mar*_*mar 5 opencv computer-vision photogrammetry

所以我需要做的是从普通用户拍摄的图像中测量脚长。该图像将包含一只脚穿着黑色袜子,一枚硬币(或其他已知尺寸的物体)和一张白纸(例如 A4),其他两个物体将位于其中。我已经拥有了什么?- 我已经使用过 opencv,但只是简单的项目;- 我已经开始阅读一些关于相机校准的文章(“学习 OpenCv”),但仍然不知道我是否必须走这么远。

我现在需要的是一些方向,因为我仍然不明白我是否遵循正确的方法来解决这个问题。我有一些问题:我真的需要校准相机才能测量足部的两个或三个尺寸吗?我怎样才能找到兴趣点来测量线,每张图片都是不同的图片还是有技巧可循?

Ps:对不起我的英语,我真的需要改进它:-/

Thr*_*986 4

首先,一些图像采集的事情:

  1. 你能相信黑袜子和白背景吗?颜色并不重要,重要的是袜子和背景之间的高对比度。
  2. 你能标准化视角吗?直接向下看脚会减少透视变形。
  3. 你能标准化场景的照明吗?这将简化下面讨论的许多处理过程。
  4. 最后,如果您缩放(或将相机放置得更近)以使脚占据更多的图像帧,您将获得更好的估计。

分析。(请注意,本讨论将针对识别脚轴的问题。识别和分析硬币将使用类似的过程,但会出现一些差异。)

  1. 下一个任务是隔离感兴趣区域 (ROI)。如果您的相机俯视脚部,则 ROI 可以限制在白色矩形内。我对这篇 Stack Overflow 帖子的回答是正方形/矩形识别的一个良好的开始:What is the simple * Correct* method to detector squares in an image?
  2. 如果脚完全位于白色矩形中,您可以将图像剪切到步骤 1 中找到的矩形。这会将图像分析限制在白皮书内的区域。
  3. 使用阈值函数“二值化”图像:http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-threshold。如果阈值参数选择得当,您应该能够将图像缩小为黑色区域(袜子像素)和白色区域(非袜子像素)。
  4. 现在乐趣开始了:您可以尝试匹配轮廓,但如果这是我的问题,我会使用边界框来快速解决方案,或者使用边界框来获得更有趣(并且可能更强大)的解决方案。
  5. 使用 cvFindContours 查找黑色(袜子)区域的轮廓:http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours
  6. 使用 cvApproxPoly 将轮廓转换为多边形形状 http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#approxpoly
  7. 对于简单的解决方案,使用 cvMinRect2 为袜子形状找到任意方向的边界框。框的短轴应对应于 largura.jpg 中的行,框的长轴应对应于 comprimento.jpg 中的行。 http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#minareaect2
  8. 如果您想要更高(可能)的准确性,您可以尝试使用 cvMoments 来计算形状的矩。http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#moments
  9. 使用 cvGetSpatialMoment 确定脚的轴。有关空间矩的更多信息可以在这里找到: http: //en.wikipedia.org/wiki/Image_moments#Examples_2和这里http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#getspatialmoment
  10. 已知轴后,您可以旋转图像,使长轴与轴对齐(即垂直)。然后,您可以简单地计算水平和垂直像素以获得线条的长度。请注意,在这个面向矩的过程中有几个假设。这是一个有趣的解决方案,但它可能无法提供更高的精度 - 特别是因为尺寸测量的精度很大程度上取决于上面讨论的相机定位问题。

最后,我提供了旧 C 接口的链接。您可能会看一下新的 C++ 界面(我只是还没有抽出时间将代码迁移到 2.4)