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
)
幸运的是,该功能恰好需要四次检测。这是输出:
每当我尝试使用 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
)
幸运的是,该功能恰好需要四次检测。这是输出: