使用已知物体尺寸从图片中测量一个物体

5
所需做的是从普通用户拍摄的图像中测量出脚长。该图像将包含穿着黑袜子的脚、一枚硬币(或其他已知大小的物品)以及放置其他两个物品的白纸(例如A4纸)。
我已经有什么了? - 我已经使用过OpenCV,但只是简单的项目; - 我已经开始阅读一些关于相机校准的文章("学习OpenCv"),但仍然不知道我是否必须走得那么远。
现在我需要一些指导,因为我仍然不明白我是否正在按照正确的方式解决这个问题。我有一些问题:我真的需要校准相机来获得脚的两个或三个度量吗?如何找到感兴趣的点来获取线条进行测量,每张图片都是不同的图片还是有技巧可供遵循?
附注:对不起,我的英语有待改善 :-/

你能添加一张代表性图片吗?下面的答案解决了尺寸估计的问题,但没有回答你的“兴趣点”问题。有几种特征识别方法可用,并且一张带有期望特征的图片会有所帮助。 - Throwback1986
首先感谢您的快速回复。 想象一下像这样的东西: https://dl.dropbox.com/u/8286271/comprimento.jpg https://dl.dropbox.com/u/8286271/largura.jpg 我有这两张图片,我需要做的是测量脚的长度和宽度。但我的问题是如何找到这些线?是否有一些方法可以找到这些点? - mar
4个回答

4

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

  1. 您能否依靠黑袜子和白色背景?颜色并不重要,重要的是袜子和背景之间的高对比度。
  2. 您能否标准化观察角度?直接从上方看脚会减少透视畸变。
  3. 您能否标准化场景照明?这将简化下面讨论的大部分处理。
  4. 最后,如果您缩放(或将相机位置靠近),使脚填满更多的图像框架,您将得到更好的估计。

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

  1. 下一个任务是隔离感兴趣的区域(ROI)。如果您的相机朝向脚,那么ROI可以限制在白色矩形内。我的答案是一个好的开始,用于平方/矩形识别: 什么是最简单*正确*的方法来检测图像中的矩形?
  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)。

3

多年前,Antonio Criminisi可能已经对这个主题做出了最后的结论。如果您有时间,可以查看他的“Single View Metrology”论文以及他的博士论文。


0

我不确定你是否需要自己构建这个,但如果你只是需要完成而不需要编码,你可以使用KLONK Image Measurement。有免费和付费版本可供选择。


0
如果图像中有一个已知大小的物体,您就不必校准相机。好吧……至少如果您的相机不会扭曲太多,并且如果您不期望高质量的测量结果。
一种简单的方法是检测白色(透视失真的)矩形,将其角落映射到未失真的矩形上(使用例如cv :: warpPerspective()),并使用该矩形的已知大小来确定图片中其他对象的大小。但这仅适用于与纸张在同一平面上的对象,最好离它不太远。

因此,只有在需要更高质量的测量时,校准才是一种解决方案。让我检查一下是否理解了您的解决方案:首先,我必须检测到一个白色矩形,该矩形映射已知对象(例如硬币)的轮廓。其次,一旦我知道宽度长度之间的比例,我必须使用cv :: warpPerspective()消除透视引起的效果。完成这些步骤后,就可以进行任何测量。 - mar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接