- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在格式化要传递给 undistortPoints (opencv 2.4.1) 的 x,y 点列表时遇到问题。
错误消息是特定于 C++ 的,并提示点数组不是 CV_32FC2 类型。难道我不能传入 Nx2 numpy 数组吗?
import cv2
camera_matrix = array(mat('1.3e+03, 0., 6.0e+02; 0., 1.3e+03, 4.8e+02; 0., 0., 1.'), dtype=float32)
dist_coeffs = array(mat('-2.4-01, 9.5e-02, -4.0e-04, 8.9e-05, 0.'), dtype=float32)
test = zeros((10,2), dtype=float32)
print test.shape, type(test)
xy_undistorted = cv2.undistortPoints(test, camera_matrix, dist_coeffs)
结果:
opencv/modules/imgproc/src/undistort.cpp:279: error: (-215) CV_IS_MAT(_src) && CV_IS_MAT(_dst) && (_src->rows == 1 || _src->cols == 1) && (_dst->rows == 1 || _dst->cols == 1) && _src->cols + _src->rows - 1 == _dst->rows + _dst->cols - 1 && (CV_MAT_TYPE(_src->type) == CV_32FC2 || CV_MAT_TYPE(_src->type) == CV_64FC2) && (CV_MAT_TYPE(_dst->type) == CV_32FC2 || CV_MAT_TYPE(_dst->type) == CV_64FC2) in function cvUndistortPoints
在 samples/python2/video.py 中有 projectPoints 的用法,它接受一个数组并对其进行整形 (-1,3),从而为该函数生成一个 Nx3 数组,看起来相同的格式应该在这里工作。
最佳答案
我不太了解相机校准。但是看到你的代码和错误,我改成如下:
import cv2
import numpy as np
camera_matrix = np.array([[1.3e+03, 0., 6.0e+02], [0., 1.3e+03, 4.8e+02], [0., 0., 1.]], dtype=np.float32)
dist_coeffs = np.array([-2.4-01, 9.5e-02, -4.0e-04, 8.9e-05, 0.], dtype=np.float32)
test = np.zeros((10,1,2), dtype=np.float32)
xy_undistorted = cv2.undistortPoints(test, camera_matrix, dist_coeffs)
print xy_undistorted
下面是我得到的结果,检查是否正确:
[[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]
[[ 0.0187303 0.01477836]]]
问题是什么:
错误表明,源应该是一行或一列
。应该是CV_32FC2或者CV_64FC2,意思是双 channel , float 。因此,使您的 src 形状为 (10,1,2) 或 (1,10,2)
。这两种方法都有效并给出相同的结果(我自己检查过)。唯一的问题是,我不知道它是否正确,所以自己检查一下。
关于python - 如何使用 python cv2 api 为 undistortPoints 格式化 xy 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11017984/
我有一个 (x,y) 点、一个 3x3 相机矩阵和 4 个失真系数,我想得到未失真的点。我的代码看起来像这样...... double distorted_point_x = 10; double_d
我使用 openCV 函数 projectPoints() 来旋转、平移和投影一组 3D 点,并使用 solvePnp() 来找到这个旋转和平移。当镜头畸变系数全部为零时,这很有效,否则就会失败。完全
我正在使用 OpenCV 的失真模型进行一些测试。基本上我所做的是,实现失真方程并查看 cv::undistortPoints 函数是否给出这些方程的反函数。我意识到 cv::undistortPoi
我试图理解 OpenCV 的 cv::undisortPoints() 迭代逼近算法背后的逻辑。 实现可在以下位置获得: https://github.com/Itseez/opencv/blob/m
我正在编写我的相机校准算法,遇到以下困难。 给定针孔相机模型,则通过以下公式对径向变形进行建模 其中x,y是理想的标准化图像坐标,x_head是变形后x的坐标。 问题是如何为逆失真函数找到k1,k2,
我正在尝试使用 OpenCV Python 中的结构光对来自投影仪和相机的点进行三角测量。在这个过程中,我有一个在相机和投影仪之间一对一匹配的元组列表。我将其传递给 cv2.undistortedPo
我试图通过使用带有两个摄像头的 OpenCV 2.3.1 来确定两个对象之间的距离,但无法计算对象的对象点(OCV 2.3.1、MSVC++、Windows 7)。我认为这是因为在计算视差之前没有对图
我正在尝试使用 OpenCV 的“取消扭曲点”方法取消扭曲图像的某些点,但没有成功。 这些将是我的无失真系数 optic_camera_matrix: [[710.52285, 0.0,
我正在尝试找到捕获同一场景的两个摄像机(或者实际上是一个移动摄像机)之间的欧氏变换,其中校准数据 K(内部参数)和 d(失真系数)是已知的。我通过提取特征点、匹配它们并使用最佳匹配作为对应来做到这一点
为了更广泛的受众,我在这里重新发布了我在 answers.opencv.org 上提出的问题 TL;DR:传递给 undistortPoints、findEssentialMat 和 recoverP
我一直在使用 opencv,但我似乎无法让 undistortPoints 工作。它返回的矩阵只有 NaN 值。 //newKeyPoints is std::vector, and it's
为了测试,我生成了一个网格图像作为矩阵,并再次将网格点作为点数组: 这表示“扭曲”的相机图像以及一些特征点。当我现在取消扭曲图像和网格点时,我得到以下结果: (请注意,“失真”图像是直的而“未失真”图
根据我的理解,undistortPoints 在扭曲图像上获取一组点,并计算它们的坐标在同一图像的未扭曲版本上的位置。同样,projectPoints 将一组对象坐标映射到它们对应的图像坐标。 但是,
我正在尝试获取空间中几个点的 3D 坐标,但我从 undistortPoints() 和 triangulatePoints() 都得到了奇怪的结果。 由于两个相机的分辨率不同,我分别校准,得到0,3
我尝试纠正图像和图像上的一些点。纠正图像效果很好(这部分代码不是我的): (mapx, mapy) = cv2.initUndistortRectifyMap(camera_matrix,dist_c
我在格式化要传递给 undistortPoints (opencv 2.4.1) 的 x,y 点列表时遇到问题。 错误消息是特定于 C++ 的,并提示点数组不是 CV_32FC2 类型。难道我不能传入
我是一名优秀的程序员,十分优秀!