因此,我需要做的是测量从一个普通用户拍摄的图像英尺长。 该图像将包含与黑色穿着袜子,硬币(或其它已知的尺寸的对象),和一个白纸(例如A4),其中其它两个对象将取决于一英尺。 我已经有了? -I已经与OpenCV的,但只是简单的项目合作; -I已经开始阅读有关摄像机标定一些文章( “学习OpenCV的” ),但仍然不知道有没有走得这么远。
什么我现在需要一些方向,因为我仍然如果我下面要解决这个问题,正确的做法不理解。 我有一些问题:我是否真的需要校准相机来获得脚的两个或三个措施? 我如何才能找到兴趣点,以获得线来衡量,每一个画面是一个不同的图片或有技巧可循?
PS:我的英语很抱歉,我真的要改进: - /
首先,一些图像采集的东西:
- 你能指望上的黑色袜子和白色背景? 颜色并不重要一样多的袜子和背景之间的高对比度。
- 你可以规范视角? 展望直接倒在脚下会降低透视畸变。
- 你可以规范现场的照明? 这将缓和了许多下面讨论的处理。
- 最后,如果你放大,你会得到更好的估计(或定位摄像头更近)使脚部更充满图像帧的。
分析。 (请注意,此讨论将针对您的识别脚的轴。识别分析硬币将使用类似的过程中的问题,但会出现一些差异。)
- 接下来的任务是隔离感兴趣(ROI)的区域。 如果您的相机在脚下低头,那么投资回报率可以限制为白色矩形。 我要回答的堆栈溢出职位是一个良好的开端,以正方形/长方形标识: 什么是图像中最简单的* *正确的方法来检测矩形?
- 如果脚的白色矩形完全列出,您可以将图像片段在步骤1中找到的RECT。 这将限制白皮书内的图像分析的区域。
- “二值化”使用阈值功能的图像: 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)
安东尼Criminisi可能写了一篇关于这个问题几年前的最后一个字。 看他的“单一视图计量”的纸张,和他的博士论文,如果你有时间。
您不必如果你有你的形象已知大小的物体,以校准相机。 嗯......至少,如果你的相机不变形太多,如果你不希望高质量测量。
一个简单的方法是将检测到白色(透视失真)的矩形,映射角落未失真的矩形(例如,使用CV :: warpPerspective()),并使用该矩形的已知大小来确定在所述其他对象的大小图片。 但是,这仅适用于在同一平面纸对象,最好不要离得太远了。
我不知道,如果你需要这个自己构建的,但如果你只需要做到这一点,而不是代码它。 您可以使用KLONK图像测量了这一点。 有一个免费的和应付版本。