5

私はチェス盤に対するカメラの相対位置を見つけようとしています (またはその逆)。この段階では、キャリブレーションだけでなく、実際の位置決定にもチェス盤を使用することにしましfindChessboardCornersimagePoints

私はこのトピックについて多くのことを読んでおり、solvePnP出力を理解していると感じています (私はまったくのopenCV初心者であり、一般的なコンピューター ビジョンでもあります)。残念ながら、私が得た結果とsolvePnPテスト セットアップを物理的に測定した結果は異なります。25%。x方向は完全にy間違っています-数桁の大きさで、カメラ座標系であると私が読んだものとは異なる方向です(xは画像を上向き、yは右向き、zはカメラから離れています)。ワールド座標のカメラ ポーズに変換するtvecと、違いは持続します。rvec

私の質問は次のとおりです。

  • カメラとワールド座標系の軸の方向は?
  • solvePnP指定したのと同じ単位で翻訳を出力しますobjectPointsか?
  • 世界の原点をobjectPoints(チェス盤の角の 1 つ) の最初のものとして指定しました。それはOKでtvec、カメラ座標から正確にそのポイントへの変換ですか?

これは私のコードです(例外などをスローしないため、プロフォーマとして添付します)。グレースケール画像を使用して、キャリブレーション中にカメラの固有行列と歪み係数を取得したので、グレースケールでもローカリゼーションを実行することにしました。chessCoordinates原点 (角の点の 1 つ) に対するチェス盤の点の位置 (mm) のリストです。camMatrixdistCoefficientsはキャリブレーションから来ています (同じチェス盤と を使用して実行されますobjectPoints)。

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )

imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
4

2 に答える 2

12

カメラ座標は画像座標と同じです。したがって、x 軸はカメラから右側を指し、y 軸は下を指し、z はカメラが向いている方向を指します。これは時計回りの斧システムで、チェス盤にも同じことが当てはまります。たとえば、チェス盤の右上隅に原点を指定した場合、x 軸は長辺に沿って右に、y は短辺に沿って進みます。チェス盤の場合、z 軸は地面に向かって下向きになります。

Solve PnP は、チェス盤フィールドの長さを指定した単位と同じ単位で変換を出力しますが、カメラ マトリックスを使用するため、カメラ キャリブレーションで指定された単位も使用する場合があります。

Tvec は、キャリブレーション オブジェクトを配置したワールド座標の原点を指します。したがって、最初のオブジェクト ポイントを (0,0) に配置すると、そこが tvec のポイントになります。

于 2013-07-02T14:45:56.727 に答える