python - 从自上而下的相机确定多边形表面旋转的方法

标签 python opencv scikit-learn scikit-image

我有一个网络摄像头俯视一个绕单轴旋转的表面。我希望能够测量表面的旋转角度。

相机位置和表面的旋转轴都是固定的。表面现在是一种明显的纯色,但如果有帮助,我确实可以选择在表面上绘制特征。

这是一个表面在其整个范围内移动的动画,显示了不同的外观形状:

enter image description here

到目前为止我的方法:

  1. 记录一系列“校准”图像,其中表面在每幅图像中处于已知角度
  2. 对每个图像设置阈值以隔离表面。
  3. 使用 cv2.approxPolyDP() 找到四个角。我遍历各种 epsilon 值,直到找到一个恰好产生 4 分的值。
  4. 一致地排列点(左上、右上、右下、左下)
  5. 用 atan2 计算每个点之间的角度。
  6. 使用角度拟合 sklearn linear_model.linearRegression()

这种方法仅用 3 张训练图像(涵盖完全正、完全负和中间位置)就使我的预测在实际值的 10% 以内。我对 opencv 和 sklearn 都很陌生;有什么我应该考虑做不同的事情来提高我预测的准确性吗? (大概增加训练图片的数量就大了??)

我确实直接用 cv2.moments 作为我的模型特征进行了实验,然后是一些 values derived from the moments , 但这些表现不如角度。我也尝试使用 RidgeCV 模型,但它的表现似乎与线性模型大致相同。

最佳答案

如果我很清楚,您想估计多边形相对于相机的旋转。如果你知道物体在 3D 中的长度,你可以使用 solvePnP估计物体的姿态,从中可以得到物体的旋转。

步骤:

  1. 校准您的网络摄像头并获取固有矩阵和畸变矩阵。

  2. 获取物体角点的 3D 测量值并找到 2d 中的对应点。假设一个矩形平面对象,3d 中的角点为 (0,0,0)、(0, 100, 0)、(100, 100, 0)、(100, 0, 0)。

  3. 使用solvePnP获取物体的旋转和平移

旋转将是您的对象沿轴的旋转。 Here你可以找到一个例子来估计头部的姿势,你可以修改它以适应你的应用

关于python - 从自上而下的相机确定多边形表面旋转的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618576/

相关文章:

Python 'String reversing' 程序

python - t-SNE 在不同的机器上产生不同的结果

python - 使用转换时 Scikit Learn 分类器加载问题 : Vocabulary wasn't fitted or is empty!

Python 从 List 中删除几个重复项

python - 运行本地 pip 安装时如何自定义复制到 tmp 目录中的文件?

python - 使用mutual_info回归进行特征选择时的 reshape 错误

c++ - 如何计算 OpenCV C++ 中按列聚合的亮度直方图

c# - Emgu OpenCV Intptr 到 IplImage?

python-3.x - 增加图像的宽度/高度(不调整大小)

python - Scikit-Learn 管道拟合和转换误差