首先,一些图像采集的东西:
- 你能依靠黑袜子和白色背景吗?颜色与袜子和背景之间的高对比度无关紧要。
- 你可以标准化视角吗?直视脚部会减少透视变形。
- 你可以标准化场景的照明吗?这将简化下面讨论的许多处理。
- 最后,如果你缩放(或将相机放得更近),你会得到一个更好的估计,这样脚可以填充更多的图像框。
醇>
分析。 (请注意,此讨论将针对您识别脚的轴的问题。识别和分析硬币将使用类似的过程,但会出现一些差异。)
- 下一个任务是隔离感兴趣区域(ROI)。如果您的相机俯视脚部,则ROI可以限制为白色矩形。我对Stack Overflow帖子的回答是方形/矩形识别的良好开端:What is the simplest *correct* method to detect rectangles in an image?
- 如果脚完全位于白色矩形中,则可以将图像剪切到步骤1中找到的矩形。这会将图像分析限制在白皮书内的区域。
- 使用阈值函数“{Binarize”图像:http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-threshold。如果您选择好的阈值参数,您应该能够将图像缩小为黑色区域(袜子像素)和白色区域(非袜子像素)。
- 现在开始有趣了:你可能会尝试匹配轮廓,但如果这是我的问题,我会使用边界框来快速解决方案,或者使用更有趣(也可能更强大)的解决方案。
- 使用cvFindContours查找黑色(袜子)区域的轮廓:http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours
- 使用cvApproxPoly将轮廓转换为多边形http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#approxpoly
- 对于简单的解决方案,使用cvMinRect2查找袜子形状的任意方向的边界框。盒子的短轴应该对应于largura.jpg中的线条,盒子的长轴应该对应于comprimento.jpg中的线条。
http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#minarearect2
- 如果您想要更多(可能)的准确度,可以尝试使用cvMoments来计算形状的时刻。 http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#moments
- 使用cvGetSpatialMoment确定脚的轴。有关空间时刻的更多信息,请访问:http://en.wikipedia.org/wiki/Image_moments#Examples_2和此处http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#getspatialmoment
- 在已知轴的情况下,您可以旋转图像,使长轴轴对齐(即垂直)。然后,您可以简单地水平和垂直计算像素以获得线条的长度。请注意,在这个面向矩的过程中有几个假设。这是一个有趣的解决方案,但它可能无法提供更高的准确性 - 特别是因为尺寸测量的准确性在很大程度上取决于上面讨论的相机定位问题。
醇>
最后,我提供了旧版C接口的链接。你可以看看新的C ++接口(我根本没有将我的代码迁移到2.4)
多年前,安东尼奥·克里米西西可能在这个主题上写下了最后一句话。如果你有时间,请查看他的
"Single View Metrology"论文和他的博士论文。
如果图像中有已知大小的物体,则无需校准相机。嗯...至少如果你的相机不会扭曲太多,并且你没有期待高质量的测量。
一种简单的方法是检测白色(透视失真)矩形,将角映射到未失真的矩形(使用例如cv :: warpPerspective())并使用该矩形的已知大小来确定其他矩形的大小图片中的对象。但这仅适用于与纸张在同一平面上的物体,最好不要离它太远。
我不确定你是否需要自己构建,但如果你只是需要这样做,而不是编码。您可以使用KLONK Image Measurement。有免费和应付版本。