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
opencv python-应用rodrigues函数中的旋转矩阵_Python_Opencv_Transformation_Opencv3.0 - Fatal编程技术网

opencv python-应用rodrigues函数中的旋转矩阵

opencv python-应用rodrigues函数中的旋转矩阵,python,opencv,transformation,opencv3.0,Python,Opencv,Transformation,Opencv3.0,我试图模拟一个从标记中突出的图像。这是到目前为止我的代码,它实现了图中所示的功能。本质上,我只想旋转图像,使其看起来与棋盘垂直 如您所见,我使用该代码查找规范化方形图像和相应棋盘格角之间的变换矩阵。然后我使用warpprospective获得您看到的图像。我知道我可以使用solvePnP中的旋转向量通过rodrigues()获得旋转矩阵,但我不知道下一步是什么 def transformTheSurface(inputFrame): ret, frameLeft = capleft.re

我试图模拟一个从标记中突出的图像。这是到目前为止我的代码,它实现了图中所示的功能。本质上,我只想旋转图像,使其看起来与棋盘垂直

如您所见,我使用该代码查找规范化方形图像和相应棋盘格角之间的变换矩阵。然后我使用
warpprospective
获得您看到的图像。我知道我可以使用
solvePnP
中的旋转向量通过
rodrigues()
获得旋转矩阵,但我不知道下一步是什么

def transformTheSurface(inputFrame):
    ret, frameLeft = capleft.read()
    capGray = cv2.cvtColor(frameLeft,cv2.COLOR_BGR2GRAY)
    found, corners = cv2.findChessboardCorners(capGray, (5,4), None, cv2.CALIB_CB_NORMALIZE_IMAGE + cv2.CALIB_CB_ADAPTIVE_THRESH ) #,None,cv2.CALIB_CB_FAST_CHECK)
    if (found):
        npGameFrame = pygame.surfarray.array3d(inputFrame)
        inputFrameGray = cv2.cvtColor(npGameFrame,cv2.COLOR_BGR2GRAY)
        cv2.drawChessboardCorners(frameLeft, (5,4), corners, found)
        q = corners[[0, 4, 15, 19]]
        ret, rvecs, tvecs = cv2.solvePnP(objp, corners, mtx, dist)
        ptMatrix = cv2.getPerspectiveTransform( muffinCoords, q)

        npGameFrame = cv2.flip(npGameFrame, 0)

        ptMatrixWithXRot = ptMatrix * rodRotMat[0]
        #inputFrameConv = cv2.cvtColor(npGameFrame,cv2.COLOR_BGRA2GRAY)
        transMuffin = cv2.warpPerspective(npGameFrame, ptMatrix, (640, 480)) #, muffinImg, cv2.INTER_NEAREST, cv2.BORDER_CONSTANT,  0)

编辑: 我还添加了一些代码,希望创建自己的3x3转换矩阵。我用了这个。以下是我的代码:

#initialization happens earlier in code
muffinCoords = np.zeros((4,2), np.float32)
muffinCoords[0] = (0,0)
muffinCoords[1] = (200,0)
muffinCoords[2] = (0,200)
muffinCoords[3] = (200,200)

A1 = np.zeros((4,3), np.float32)
A1[0] = (1,0,322)
A1[1] = (0,1,203)
A1[2] = (0,0,0)
A1[3] = (0,0,1)

R = np.zeros((4,4), np.float32)
R[3,3] = 1.0

T = np.zeros((4,4), np.float32)
T[0] = (1,0,0,0)
T[1] = (0,1,0,0)
T[2] = (0,0,1,0)
T[3] = (0,0,0,1)
#end initialization

#load calib data derived using cv2.calibrateCamera, my Fx and Fy are about 800
loadedCalibFileMTX = np.load('calibDataMTX.npy')
mtx = np.zeros((3,4), np.float32)
mtx[:3,:3] = loadedCalibFileMTX


我终于想出了正确的方法。你可以在这里找到代码

注意: 几乎所有的游戏代码都是由Leif Theiden编写的,并且在.py文件中指定的许可证下。与计算机视觉相关的代码位于states.py中。我用这个游戏只是为了向那些希望在简单的计算机视觉中起步的人展示它是可以做到的

每次调用一个新曲面(PyGame for frame simply)以在主窗口上显示时,我的代码都会打开一个线程。我在该点启动一个线程并执行一个简单的计算机视觉功能,该功能执行以下操作:

  • 在相机流帧中搜索5x4棋盘(cv2.findChessboardCorners)
  • 然后将找到的角绘制到图像上
  • 使用cv2.PNP,导出近似姿势(旋转和平移向量)
  • 然后,将描述正方形的3d点从步骤3确定的3d空间投影到2d空间。这用于将预先指定的三维结构转换为可用于在二维图像上绘制图形的内容
  • 但是,此步骤将查找从一组2d方形点(游戏帧的尺寸)到新找到的投影2d点(3d帧的尺寸)的变换。现在您可以看到,我们试图做的只是两步转换
  • 然后,我对捕获的流帧和转换后的游戏帧执行基本教程样式的添加,以获得最终图像
  • 变量:

    +
    从三维跨矩阵
    ->将投影三维结构的点转换为二维点。这些是你看到的红点

    +
    q
    ->这是我们确定姿势的基准面

    +
    ptMatrix
    ->最终转换,将游戏框架转换为适合投影框架

    查看最上面文件夹中的屏幕;]

    享受吧

    #this is new to my code, creating what I interpret as Rx*Ry*Rz
    ret, rvecCalc, tvecs = cv2.solvePnP(objp, corners, loadedCalibFileMTX, dist)
    rodRotMat = cv2.Rodrigues(rvecCalc)
    R[:3,:3] = rodRotMat[0]
    
    #then I create T
    T[0,3] = tvecs[0]
    T[1,3] = tvecs[1]
    T[2,3] = tvecs[2]
    
    # CREATING CUSTOM TRANSFORM MATRIX
    # A1 -> 2d to 3d projection matrix
    # R-> rotation matrix as calculated by solve PnP, or Rx * Ry * Rz
    # T -> converted translation matrix, reference from site, vectors pulled from tvecs of solvPnP
    # mtx -> 3d to 2d matrix
    # customTransformMat = mtx * (T * (R * A1)) {this is intended calculation of following}
    first = np.dot(R, A1)
    second = np.dot(T, first)
    finalCalc = np.dot(mtx, second)
    
    finalNorm = finalCalc/(finalCalc[2,2]) # to make sure that the [2,2] element is 1
    
    transMuffin = cv2.warpPerspective(npGameFrame, finalNorm, (640, 480), None, cv2.INTER_NEAREST, cv2.BORDER_CONSTANT,  0)
    #transMuffin is returned as undefined here, any help?
    
    # using the cv2.getPerspectiveTransform method to find what you can find pictured at the top
    ptMatrix = cv2.getPerspectiveTransform( muffinCoords, q)