체스 보드에 대한 카메라의 상대 위치 (또는 다른 방향)를 찾으려고합니다. 다른 좌표계간에 변환하면 좋을 것 같습니다. 제안 된대로 here. 나는 findChessboardCorners
을 사용하여 imagePoints
을 얻을 수 있기 때문에이 단계에서 교정뿐만 아니라 실제 위치 결정도 체스 판을 사용하기로 결정했습니다.OpenCV : solvePnP tvec 단위 및 축 방향
나는이 주제에 대해 많이 읽었으며 과 컴퓨터 비전에 대해 완전히 익숙하지 않더라도 solvePnP
결과를 이해한다고 생각합니다. 불행하게도, solvePnP
에서 얻은 결과와 실제 테스트 설정을 측정 한 결과는 다릅니다. z 방향으로의 이동이 약 빗나갑니다. 25 %. x
및 y
방향은 완전히 잘못되었습니다. 카메라 좌표계 (x는 이미지를 가리키고, y는 카메라에서 멀리 떨어져 있음)로 읽은 것보다 몇 배와 다른 방향입니다. tvec
및 rvec
을 월드 좌표의 카메라 포즈로 변환하면 차이가 지속됩니다.
내 질문은 :
- 카메라와 세계 체제 '좌표축의 방향은 무엇인가?
solvePnP
은objectPoints
을 지정했을 때와 동일한 단위로 번역을 출력합니까?- 나는 세계 기원을
objectPoints
(체스 판 코너 중 하나)의 첫 번째로 지정했습니다. 그게 괜찮습니까tvec
정확히 좌표에서 카메라 좌표로 번역?
이것은 내 코드입니다 (예외가 발생하지 않으므로 pro forma을 첨부합니다). 그레이 스케일 이미지를 사용하여 카메라 내장 함수 행렬 및 보정 중 왜곡 계수를 얻었으므로 회색 음영으로 현지화를 수행하기로 결정했습니다. chessCoordinates
은 원점 (코너 포인트 중 하나)에 대한 체스 판 포인트 위치 목록 (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)
큰 답변, 고마워. 나는이 물건의 일부를 이전에 어딘가에 보냈지 만 약간의 확신을 얻는 것이 좋다. 또한, 시스템 축의 조정에 대한 설명은 매우 유용합니다. 건배. –