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

2024-10-01 11:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

enter image description here

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)

编辑:

我希望在我自己的矩阵3中创建更多的希望矩阵。我用了following reference 。这是我的代码:

^{pr2}$

output of camera calibration

#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]

output of R

#then I create T
T[0,3] = tvecs[0]
T[1,3] = tvecs[1]
T[2,3] = tvecs[2]

output of T

# 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)

output of finalCalc as followed by formula in comments

finalNorm = finalCalc/(finalCalc[2,2]) # to make sure that the [2,2] element is 1

output of finalNorm

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)

output of ptMatrix


Tags: to代码图像is矩阵cv2matrixret
1条回答
网友
1楼 · 发布于 2024-10-01 11:24:28

我终于找到了正确的方法。您可以在此处找到代码https://github.com/mikezucc/augmented-reality-fighter-pygame

通知:

几乎所有的游戏代码都是由Leiftheiden编写的,并且是在.py文件中指定的许可下编写的。与计算机视觉相关的代码在状态.py. 我用这个游戏只是为了向其他人展示它是可以做到的,因为其他人希望从简单的计算机视觉开始。在

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

  1. 在摄影机流帧中搜索5x4棋盘(cv2.findChessboardCorners)
  2. 然后将找到的角点绘制到图像上
  3. 利用cv2.solvePnP,导出了近似姿态(旋转和平移矢量)
  4. 然后,描述正方形的3d点从步骤3确定的3d空间投影到2d空间。这是用来转换一个预先确定的三维结构,你可以用来图形的二维图像。在
  5. 然而,这一步会找到从一组2d正方形点(游戏框架的尺寸)到新发现的投影2d点(3d框架的)的转换。现在你可以看到,我们所做的只是简单地进行两步转换。在
  6. 然后我执行一个基本的教程风格的添加捕获流帧和转换后的游戏帧,以获得最终图像

变量:

+from3dTransMatrix->;投影三维结构到二维点的点。这些是你看到的红点

+q->;这是我们确定姿势的参照平面

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

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

享受吧!在

相关问题 更多 >