Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python openCV 2.4.3 cv2.PNP错误_Python_Opencv_Numpy - Fatal编程技术网

Python openCV 2.4.3 cv2.PNP错误

Python openCV 2.4.3 cv2.PNP错误,python,opencv,numpy,Python,Opencv,Numpy,我不熟悉Python、OpenCV和Numpy。我一直试图实现一个Python版本的C++代码,它决定相机相对于已知标记的相对姿态。这段代码使用cv2.SolvePnP函数,我一直想运行这个函数。我在网上搜索过,但是没有发现任何与此功能类似的混淆。似乎无论我以何种形式传递数据,函数都不满意。我一直在使用的测试用例是: ## target image points tPoints = np.zeros((4,2),dtype=np.float64) tPoints[0,0] = 384.3331

我不熟悉Python、OpenCV和Numpy。我一直试图实现一个Python版本的C++代码,它决定相机相对于已知标记的相对姿态。这段代码使用cv2.SolvePnP函数,我一直想运行这个函数。我在网上搜索过,但是没有发现任何与此功能类似的混淆。似乎无论我以何种形式传递数据,函数都不满意。我一直在使用的测试用例是:

## target image points

tPoints = np.zeros((4,2),dtype=np.float64)
tPoints[0,0] = 384.3331
tPoints[0,1] = 162.23618
tPoints[1,0] = 385.27521
tPoints[1,1] = 135.21503
tPoints[2,0] = 409.36746
tPoints[2,1] = 165.64435

## actual marker point set

mPoints = np.zeros((4,3),dtype=np.float64)
mPoints[0,0] = -88.0
mPoints[0,1] = 88.0
mPoints[0,2] = 0
mPoints[1,0] = -88.0
mPoints[1,1] = -88.0
mPoints[1,2] = 0
mPoints[2,0] = 88.0
mPoints[2,1] = -88.0
mPoints[2,2] = 0
mPoints[3,0] = 88.0
mPoints[3,1] = 88.0
mPoints[3,2] = 0

camMatrix = np.zeros((3,3),dtype=np.float64 )
camMatrix[0][0] = 519.0
camMatrix[0][2] = 320.0
camMatrix[1][1] = 522.0
camMatrix[1][2] = 240.0
camMatrix[2][2] = 1.0

retval, rvec, tvec = cv2.solvePnP(objectPoints = tPoints, imagePoints = mPoints, cameraMatrix = camMatrix, distCoeffs = None)
返回的错误为:

cv2.error:C:\slave\wininstallermagapack\src\opencv\modules\calib3d\src\solvepnp.cpp:52:>错误:(-215)npoints>=0&&npoints==std::max(ipoints.checkVector(2,CV\u 32F),>ipoints.checkVector(2,CV\u 64F))


我将非常感谢您帮助我执行此操作,以及关于我哪里出错的信息。还有很多东西要学

您给
solvePnP
的参数的形状不正确
objectPoints
应为Nx3,而
imagePoints
应为Nx2。在您的示例中,如果我切换
t点
mpoint
如何分配给这些参数,则不会引发异常。

如果尝试将数组切片作为输入,这也会导致问题。取自

World=array([-0.5,-0.5,3.],
[ 0.5, -0.5,  3. ],
[ 0.5,  0.5,  3. ],
[-0.5,  0. ,  3. ]])
keyPoints=数组([[279.03286469,139.80463604,1.],
[ 465.40665724,  136.70519839,    1.        ],
[ 465.40665724,  325.1505936 ,    1.        ],
[ 279.03286469,  230.927896  ,    1.        ]])
objectPoints=世界

imagePoints=keyPoints[:,:2]#看起来相关:谢谢!我似乎对什么是“objectPoints”和什么是“imagePoints”感到困惑。我真的很感谢你的快速帮助!我仍然有问题。当我更改两个数组时,异常消失,但被另一个错误所取代,“ValueError:需要2个以上的值才能解包”。我假设我对数组的格式设置不正确,但我仍然不知所措。谢谢你的帮助。我想我找到问题了。OpenCV 4.3.2文档声明函数调用返回三个值:“Python:cv2.solvePnP(objectPoints、imagePoints、cameraMatrix、distcoefs[、rvec[、tvec[、useExterinsicguess[、flags]]”)→ retval、rvec、tvec”。看起来实际上只返回了rvec和tvec,因为在没有指定第三个变量(“retval”)的情况下,一切似乎都正常工作。不确定数组值是否正确,但至少我有一些似乎有效的方法。谢谢你看我的问题。(我想你的意思是2.4.3。)奇怪。我使用的是2.4.2,您的代码对我很有用(在添加了适当的导入并交换了objectPoints和imagePoints参数之后)。我不希望一个point版本能做出如此根本性的API更改。是的,2.4.3,我的脑子已经累了。我进一步跟踪了这个问题,这是我的“坏”,因为这台笔记本实际上是openCV的旧版本,而不是我的工作机器正在使用的2.4.3……我认为我已经更新了这两个版本,显然我没有。但是,还是要感谢您指出阵列问题,因为这确实解决了问题!
World = array([[-0.5, -0.5,  3. ],
               [ 0.5, -0.5,  3. ],
               [ 0.5,  0.5,  3. ],
               [-0.5,  0. ,  3. ]])
keyPoints = array([[ 279.03286469,  139.80463604,    1.        ],
                     [ 465.40665724,  136.70519839,    1.        ],
                     [ 465.40665724,  325.1505936 ,    1.        ],
                     [ 279.03286469,  230.927896  ,    1.        ]])

objectPoints = World
imagePoints = keyPoints[:,:2] # <--- THIS SLICE IS A PROBLEM CAUSER!!!
cv2.solvePnP(objectPoints, imagePoints, np.eye(3), np.zeros(5))