C++ 如何利用opencv提高测量精度

C++ 如何利用opencv提高测量精度,c++,opencv,C++,Opencv,我最近想测量脚的长度。我使用信用卡作为参考,因为信用卡的大小是已知的且稳定的(8.5cm*5.4cm),长边“cardL”。我们假设脚的长度为“footL” 过程: 用脚和信用卡拍照 获取信用卡的轮廓,并使用Minareact功能测量卡的大小,获得卡的长边(cardl) 使用相同的方法获得脚的轮廓和脚的长度(footl) 使用公式:cardl:footl=cardl:footl 我照了一张照片如下。我测量的脚的长度是22.4厘米。照片中脚的像素长度是2137.6。卡的像素长边缘为763.14,因

我最近想测量脚的长度。我使用信用卡作为参考,因为信用卡的大小是已知的且稳定的(8.5cm*5.4cm),长边“cardL”。我们假设脚的长度为“footL”

过程:

  • 用脚和信用卡拍照

  • 获取信用卡的轮廓,并使用Minareact功能测量卡的大小,获得卡的长边(cardl)

  • 使用相同的方法获得脚的轮廓和脚的长度(footl)

  • 使用公式:cardl:footl=cardl:footl

  • 我照了一张照片如下。我测量的脚的长度是22.4厘米。照片中脚的像素长度是2137.6。卡的像素长边缘为763.14,因此footL=24cm。这个结果是不精确的。如何提高测量精度

    另一个问题是,当我在不同高度拍摄照片时(每次脚的像素都不同,结果‘footL’比实际值大得多,因为高度较小。)

    我喜欢你的想法

    一些想法;在信用卡定义的同一平面上测量物体的长度。一种可能的方法是:

    • 校准您的相机(感谢@PSchn的提醒)
    • 将脚放在地面上的正常位置(不像您提供的图像中那样旋转)
    • 把信用卡放在它旁边
    • 以这样一个角度拍摄一张照片,它包括
      • 整个信用卡(无遮挡)
      • 要测量的对象的尺寸,例如,在您的案例中,脚趾到脚跟的尺寸
    • 对图像应用单应变换,将信用卡的投影转换为(信用卡大小的)矩形
    • 最后,应用公式4。在上面的列表中

    对于一个简单的实现(如您所描述的),您的参考和样品必须与相机处于同一深度,所有东西都在平面和垂直方向上。你不能在参考和样本之间移动相机。而脚部恋物癖者会发疯。从你样本图像的角度来看,脚部的“末端”在哪里?我看不到一个明显的特征,事实上,我很容易在如何定义脚的长度上看到1.6厘米的不确定性。为什么信用卡周围的矩形比信用卡大得多?一般来说,你会遇到透视失真和透视的问题forshortening@Micka绿色矩形是手动绘制的。黄色矩形由代码自动绘制。别忘了校准相机;)