c++ - 如何使用opencv提高测量精度

标签 c++ opencv

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

过程:

  1. 用脚和信用卡拍照;

  2. 获取信用卡的轮廓,并使用minAreaRect函数测量卡片的大小,得到卡片的长边(cardl)

  3. 用同样的方法得到脚的轮廓,得到脚的长度(footl)

  4. 使用公式:cardl : footl = cardL : footL

例如。我拍了一张照片如下。我测的脚长是22.4cm。照片中脚的像素长度为2137.6。卡片的像素长边为 763.14,所以 footL = 24cm。这个结果是不精确的。如何提高测量精度?

eg. I took a photo as follow. I measured the length of foot is 22.4cm. the pixel length of foot in the photo is 2137.6. the pixel long edge of card is 763.14, so footL = 24cm. This result is imprecise. How could I improve the precision of measurement?

另一个问题是当我在不同高度拍照时(每次脚的像素点都不一样,高度越小,结果'footL'比实际值大很多。)

最佳答案

我喜欢你的想法!

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

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

关于c++ - 如何使用opencv提高测量精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454617/

相关文章:

opencv - 使用opencv将横向图像转换为纵向

visual-studio-2010 - 如何在opencv中获取灰色图像的强度指标

c++ - 左值需要作为赋值 C++ 数组的左操作数

c++ - std::stringstream vs std::string 用于连接许多字符串

c++ - 在 C++ 中使用 vector 的糟糕性能

c++ - cv::dft是多线程转换吗?

c++ - 在 OpenCV 中将 vector<Point3f> 转换为 CvMat*?

opencv - 如何在Unity3d中使用opencv?

c++ - 带有 Decltype 和通用引用或未定义行为的 VC++ Bug?

c++ - 在 Win32 控制台应用程序中使用 ShutdownBlockRequestCreate