编译以下opencv python源代码

时间:2019-05-05 05:39:35

标签: python python-2.7 opencv opencv3.0

以下链接包含使用Opencv和python在图像中创建一些3D效果的源代码。但是问题是我无法总结分数代码。我需要完整的源代码,以便可以运行它。如果有人可以收集整个代码,那对我来说将是很棒的。

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_pose/py_pose.html

  

我们的问题是,我们要绘制3D坐标轴(X,Y,Z轴)   在我们的棋盘的第一个角落。 X轴为蓝色,Y轴为   绿色和Z轴为红色。因此,Z轴效果应该   就像它垂直于我们的棋盘平面。

     

首先,让我们加载相机矩阵和失真系数   以前的校准结果。

import cv2
import numpy as np
import glob

# Load previously saved data
with np.load('B.npz') as X:
    mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]
     

现在让我们创建一个函数,绘制在   棋盘(使用cv2.findChessboardCorners()获得)和轴   点绘制3D轴。

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
     

然后,与前面的情况一样,我们创建终止条件对象   点(棋盘角的3D点)和轴点。轴   点是3D空间中用于绘制轴的点。我们画的轴   长度3(单位为国际象棋正方形,因为我们   根据该尺寸进行校准)。所以我们的X轴从(0,0,0)绘制到   (3,0,0),因此对于Y轴。对于Z轴,从(0,0,0)绘制到   (0,0,-3)。负号表示它被拉向相机。

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)
     

现在,像往常一样,我们加载每个图像。搜索7x6网格。如果找到,我们   用次角像素对其进行优化。然后计算旋转和   翻译,我们使用函数cv2.solvePnPRansac()。一旦我们那些   变换矩阵,我们使用它们将轴点投影到   图像平面。简而言之,我们在图像平面上找到点   对应于3D空间中的(3,0,0),(0,3,0),(0,0,3)中的每一个。一旦我们   得到它们,我们从第一个角到每个这些点画线   使用我们的draw()函数。完成!!!

for fname in glob.glob('left*.jpg'):
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7,6),None)

    if ret == True:
        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

        # Find the rotation and translation vectors.
        rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners2, mtx, dist)

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

        img = draw(img,corners2,imgpts)
        cv2.imshow('img',img)
        k = cv2.waitKey(0) & 0xff
        if k == 's':
            cv2.imwrite(fname[:6]+'.png', img)

cv2.destroyAllWindows()
     

请参阅下面的一些结果。请注意,每个轴长3个正方形。

     

enter image description here

     

渲染立方体

     

如果要绘制立方体,请修改draw()函数和轴点   如下。

     

修改后的draw()函数:

def draw(img, corners, imgpts):
    imgpts = np.int32(imgpts).reshape(-1,2)

# draw ground floor in green
img = cv2.drawContours(img, [imgpts[:4]],-1,(0,255,0),-3)

# draw pillars in blue color
for i,j in zip(range(4),range(4,8)):
    img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]),(255),3)

# draw top layer in red color
img = cv2.drawContours(img, [imgpts[4:]],-1,(0,0,255),3)

return img
     

修改的轴点。它们是3D空间中多维数据集的8个角:

     

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

     

并查看以下结果:

     

enter image description here

     

如果您对图形,增强现实等感兴趣,可以使用   OpenGL渲染更复杂的图形。

0 个答案:

没有答案