OpenCV:具有大值的奇数投影

OpenCV: odd projection with large values

每当我尝试使用 cv2.projectPoints 将 3D 点投影到图像平面时,我都会得到非常大的值。即使 this tutorial 我的投影轴看起来像这样:

我试过检查我的校准矩阵,但它们看起来很正常:

intrinsic camera parameters:
[[444., 0., 316.],
 [0., 414., 263.],
 [0.,  0.,    1.]]

distortion coeffs:
[[0.09, -0.13, -0.03, 0.0, 0.39]]

rotation vector:
[[1.27, -1.16, -1.12]]

translation vector:
[[0.02, 0.5, -0.5]]

最后,投影轴值为

[[173.64,     798.27],
 [311.09,     807.81],
 [20258.80, -7491.46]]  # really large value

检测到的角是纸张 sheet 的角。由于只有四个角作为“向导”(而不是教程中使用的 42 个角),我不知道这是否是投影真正模糊的原因。任何帮助将不胜感激。

编辑。原始轴只是单位矩阵。

编辑2.代码:

while True:
  _, frame = vcap.read()
  key = cv2.waitKey(1) & 0xFF
  if key == ord("q"):
      cv2.destroyAllWindows()
      break
  
  # preprocess image
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  _, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
  thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
 
  # fetch points
  corners = find_sheet_of_paper(thresh)
  corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)

  # rotation and translation vectors for projection                                                                                  
  _, rvecs, tvecs = cv2.solvePnP(object_points, corners, mtx, dist)

  # project 3d points on 2d image
  image_points, _ = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
  image_points = np.squeeze(image_points)
  frame = draw_axis(frame, corners, image_points)
  
  cv2.imshow("", frame)

find_sheet_of_paper函数returns纸张坐标的数组。 draw_axis 功能与 link 中的功能相同。 object_points 只是一个网格:

object_points = [
  [0., 0., 0.],
  [1., 0., 0.],
  [0., 1., 0.],
  [1., 1., 0.]
]

好的,我想我明白了。由于只检测到四个点,因此数据有点嘈杂。在这些我们不能过分依赖检测的情况下,最好使用 RANSAC 算法。所以,我们应该这样做,而不是使用默认的迭代方法:

_, rvecs, tvecs, _ = cv2.solvePnPRansac(
    object_points, corners, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_P3P
)

幸运的是,该功能恰好需要四次检测。这是输出: