5

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

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

Ps:对不起我的英语,我真的必须提高它:-/

4

4 回答 4

4

首先,一些图像采集的东西:

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

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

  1. 下一个任务是隔离感兴趣区域 (ROI)。如果您的相机向下看脚,则 ROI 可以限制在白色矩形内。我对这个 Stack Overflow 帖子的回答是正方形/矩形识别的良好开端:检测图像中矩形的最简单的*正确*方法是什么?
  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#minarearect2
  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)

于 2012-07-10T19:02:43.367 回答
3

安东尼奥·克里米尼西(Antonio Criminisi)可能在几年前就这个主题写下了最后一句话。如果您有时间,请参阅他的“Single View Metrology”论文和他的博士论文。

于 2012-07-10T11:51:24.973 回答
0

我不确定您是否需要自己构建它,但如果您只需要这样做,而不是编写代码。您可以为此使用KLONK 图像测量。有免费和付费版本。

于 2013-09-03T20:49:42.917 回答
0

如果图像中有已知大小的物体,则无需校准相机。好吧...至少如果您的相机不会扭曲太多并且您不期望高质量的测量结果。

一种简单的方法是检测一个白色(透视失真)矩形,将角映射到一个未失真的矩形(使用例如 cv::warpPerspective())并使用该矩形的已知大小来确定其他对象的大小图片。但这仅适用于与纸张处于同一平面的物体,最好不要离它太远。

于 2012-07-09T16:05:09.603 回答