首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python姿态估计示例误差

Python姿态估计示例误差
EN

Stack Overflow用户
提问于 2014-12-03 22:32:26
回答 2查看 836关注 0票数 0

我是opencv的初学者,我正在尝试运行教程代码: calib3d.html

我的代码和问题:

代码语言:javascript
复制
import scipy.io
import numpy as np
import cv2
import time

# data comes from calibration program same as tutorial
data=scipy.io.loadmat('distm.mat')
dist=data['dist000']
mtx=data['mtx']
data=None

#takes the corners in the chessboard  
def draw(img, corners, imgpts):
    corner = tuple(corners[0].ravel())
    img = cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5)
    img = cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5)
    img = cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5)
    return img

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)

# cam open and wait a second to deny black or dark images                                                                              
cap = cv2.VideoCapture(2)
ret, frame = cap.read()
print "Checking camera read:"+str(ret)
while ret ==False:
    cap = cv2.VideoCapture(2)
    ret, frame = cap.read()
time.sleep(1)

# takes live photos from camera
for i in range(0,20):
    print i

    ret, img = cap.read()
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
    print ret

    if ret == True:

        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        # 'corners2' returns "none" and below codes not working so I use 'corners'
        print corners2
        # Find the rotation and translation vectors.
        rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners, mtx, dist)

        # project 3D points to image plane
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)

        img = draw(img,corners,imgpts)  # img returns None
        print img                       
        cv2.imshow('pose',img)           # error line 
        k = cv2.waitKey(0) & 0xff

,并在“cv2.imShow(‘姿态’,img)”处给出错误为:

代码语言:javascript
复制
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in
cv::imshow, file ..\..\..\modules\highgui\src\window.cpp, line 269
Traceback (most recent call last):   File "<stdin>", line 1, in
<module>   File
"C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py",
line 540, in runfile
    execfile(filename, namespace)   File "C:/Users/ACS/Documents/Python/Pose Estimation.py", line 49, in
<module>
    cv2.imshow('pose',img) cv2.error: ..\..\..\modules\highgui\src\window.cpp:269: error: (-215)
size.width>0 && size.height>0 in function cv::imshow

感谢您的关注。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 09:14:41

有一件事可能会引起麻烦,那就是没有检查cap.read()的成功:变量ret被重新分配到一个新的值,而不需要第一次检查。

围绕cap.read()下面的代码使用另一个if ret:可能会有所帮助。您会注意到在Python中没有必要使用== True

票数 1
EN

Stack Overflow用户

发布于 2014-12-04 12:04:43

谢谢阿诺的兴趣。

我解决了问题。工作代码:

代码语言:javascript
复制
import scipy.io
import numpy as np
import cv2
import time

data=scipy.io.loadmat('distm.mat')
dist=data['dist000']
mtx=data['mtx']
data=None

#takes the corners in the chessboard 
def draw(img, corners, imgpts):
    corner = tuple(corners[0].ravel())
    cv2.line(img, corner, tuple(imgpts[0].ravel()), (255,0,0), 5)
    cv2.line(img, corner, tuple(imgpts[1].ravel()), (0,255,0), 5)
    cv2.line(img, corner, tuple(imgpts[2].ravel()), (0,0,255), 5)
    return img

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)

cap = cv2.VideoCapture(2)
ret, frame = cap.read()
print "Checking camera read:"+str(ret)
while ret ==False:
    cap = cv2.VideoCapture(2)
    ret, frame = cap.read()
time.sleep(1)

for i in range(0,20):
    time.sleep(1)
    ret, img = cap.read()
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
    print str(i)+"'th image check board corners "+str(ret)
    if ret :
        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        print corners2
        # Find the rotation and translation vectors.
        rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners, mtx, dist)

        # project 3D points to image plane
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)

        img = draw(img,corners,imgpts)
        cv2.imshow('pose',img)
        k = cv2.waitKey(0) & 0xff
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27282923

复制
相关文章

相似问题

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