私はチェス盤に対するカメラの相対位置を見つけようとしています (またはその逆)。この段階では、キャリブレーションだけでなく、実際の位置決定にもチェス盤を使用することにしましfindChessboardCorners
たimagePoints
。
私はこのトピックについて多くのことを読んでおり、solvePnP
出力を理解していると感じています (私はまったくのopenCV
初心者であり、一般的なコンピューター ビジョンでもあります)。残念ながら、私が得た結果とsolvePnP
テスト セットアップを物理的に測定した結果は異なります。25%。x
方向は完全にy
間違っています-数桁の大きさで、カメラ座標系であると私が読んだものとは異なる方向です(xは画像を上向き、yは右向き、zはカメラから離れています)。ワールド座標のカメラ ポーズに変換するtvec
と、違いは持続します。rvec
私の質問は次のとおりです。
- カメラとワールド座標系の軸の方向は?
solvePnP
指定したのと同じ単位で翻訳を出力しますobjectPoints
か?- 世界の原点を
objectPoints
(チェス盤の角の 1 つ) の最初のものとして指定しました。それはOKでtvec
、カメラ座標から正確にそのポイントへの変換ですか?
これは私のコードです(例外などをスローしないため、プロフォーマとして添付します)。グレースケール画像を使用して、キャリブレーション中にカメラの固有行列と歪み係数を取得したので、グレースケールでもローカリゼーションを実行することにしました。chessCoordinates
原点 (角の点の 1 つ) に対するチェス盤の点の位置 (mm) のリストです。camMatrix
とdistCoefficients
はキャリブレーションから来ています (同じチェス盤と を使用して実行されます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)