首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV python: solvePnP ValueError:太多的值需要解包

OpenCV python: solvePnP ValueError:太多的值需要解包
EN

Stack Overflow用户
提问于 2015-01-17 06:46:54
回答 1查看 1.6K关注 0票数 0
代码语言:javascript
复制
import numpy as np
import cv2

# Focal length, sensor size (mm and px)
f = 33.0 # mm
pix_width = 4928.0 # sensor size has 4928px in width
pix_height = 3624.0 # sensor size has 4928px in width
sensor_width = 23.7 # mm
sensor_height = 15.7 # mm

# set center pixel
u0 = int(pix_width / 2.0)
v0 = int(pix_height / 2.0)

# determine values of camera-matrix
mu = pix_width / sensor_width # px/mm
alpha_u = f * mu # px

mv = pix_height / sensor_height # px/mm
alpha_v = f * mv # px

# Distortion coefs 
D = np.array([[0.0, 0.0, 0.0, 0.0]])

# Camera matrix
K = np.array([[alpha_u, 0.0, u0],
              [0.0, alpha_v, v0],
              [0.0, 0.0, 1.0]])
import numpy as np
import cv2

# Focal length, sensor size (mm and px)
f = 33.0 # mm
pix_width = 4928.0 # sensor size has 4928px in width
pix_height = 3624.0 import numpy as np
import cv2

# Focal length, sensor size (mm and px)
f = 33.0 # mm
pix_width = 4928.0 # sensor size has 4928px in width
pix_height = 3624.0 # sensor size has 4928px in width
sensor_width = 23.7 # mm
sensor_height = 15.7 # mm

# set center pixel
u0 = int(pix_width / 2.0)
v0 = int(pix_height / 2.0)

# determine values of camera-matrix
mu = pix_width / sensor_width # px/mm
alpha_u = f * mu # px

mv = pix_height / sensor_height # px/mm
alpha_v = f * mv # px

# Distortion coefs 
D = np.array([[0.0, 0.0, 0.0, 0.0]])

# Camera matrix
K = np.array([[alpha_u, 0.0, u0],
              [0.0, alpha_v, v0],
              [0.0, 0.0, 1.0]])



# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300, 2544], # left down
                  [1607, 1000], # left up
                  [3681, 2516], # right down
                  [3320, 983]],np.float32 ) # right up

# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0, 400, 0],
                    [0, 0, 0],
                    [300, 400, 0],
                    [300, 0, 0]],np.float32)

rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]
# sensor size has 4928px in width
sensor_width = 23.7 # mm
sensor_height = 15.7 # mm

# set center pixel
u0 = int(pix_width / 2.0)
v0 = int(pix_height / 2.0)

# determine values of camera-matrix
mu = pix_width / sensor_width # px/mm
alpha_u = f * mu # px

mv = pix_height / sensor_height # px/mm
alpha_v = f * mv # px

# Distortion coefs 
D = np.array([[0.0, 0.0, 0.0, 0.0]])

# Camera matrix
K = np.array([[alpha_u, 0.0, u0],
              [0.0, alpha_v, v0],
              [0.0, 0.0, 1.0]])



# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300, 2544], # left down
                  [1607, 1000], # left up
                  [3681, 2516], # right down
                  [3320, 983]],np.float32 ) # right up

# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0, 400, 0],
                    [0, 0, 0],
                    [300, 400, 0],
                    [300, 0, 0]],np.float32)

rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]



# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300, 2544], # left down
                  [1607, 1000], # left up
                  [3681, 2516], # right down
                  [3rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]



# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300, 2544], # left down
                  [1607, 1000], # left up
                  [3681, 2516], # right down
                  [3320, 983]],np.float32 ) # right up

# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0, 400,(rvec)[0]
 0],
                    [0, 0, 0],
                    [300, 400, 0],
                    [300, 0, 0]],np.float32)

rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]320, 983]],np.float32 ) # right up

# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0, 400,(rvec)[0]
 0],
                    [0, 0, 0],
                    [300, 400, 0],
                    [300, 0, 0]],np.float32)

rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]

我从OpenCV: use solvePnP to determine homography获得了这段代码,但我得到的错误如下:

代码语言:javascript
复制
File "solv.py", line 50, in <module>
rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
ValueError: too many values to unpack

我们怎样才能找到世界坐标。请帮帮我.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-17 07:16:12

如果您得到一个ValueError: too many values to unpack,这意味着左手侧的变量数与右侧返回的值数之间存在不匹配。

就你而言:

代码语言:javascript
复制
rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)

方法cv2.solvePnP()很可能在返回元组中返回两个以上的值。要快速检查这一点,请执行以下操作:

代码语言:javascript
复制
print len(cv2.solvePnP(XYZ_gcp, UV_cp, K, D))

或者更好的是,查看实际返回元组:

代码语言:javascript
复制
print cv2.solvePnP(XYZ_gcp, UV_cp, K, D)

确保你的左手和这个相匹配。egs。(未经测试):

代码语言:javascript
复制
rtval, rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)

查看这篇文章以获得更多的洞察力ValueError: too many values to unpack (Python 2.7)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27996978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档