저는 OpenCV를 파이썬과 함께 사용하여 비디오 스트림에서 카메라 포즈를 추적하려고합니다. 두 이미지 사이의 포즈를 테스트 환경으로 결정하는 코드 샘플이 있습니다. 이미지에OpenCV 및 Python으로 카메라 포즈 추정
읽기 및/크기 조정을 회색으로 변환 :
여기에 전체적인 흐름이있다.
두 이미지 모두에서 cv2 goodfeaturestotrack 기능을 추출합니다.
- 일치하는 점을 찾으려면 cv2 calcOpticalFlowPyrLK를 사용하십시오.
- 0으로 설정된 모든 점에 대해 z로 p1 지점 (시작 이미지)을 (x, y, z)로 변환하십시오.
- 회전 및 변환 벡터를 얻기 위해 cv2 PnPRansac을 확인하십시오.
- 각도를 라디안에서 각도로 변환합니다. 내가 제로에 가까운 것으로 회전 및 변환 벡터를 기다리고 있었다이 샘플 계산을 실행하는 데 정확히 동일한 이미지를 사용하고 있다는 사실을 감안할 때
def function(mtx,dist):
#feature dictionary
feature_params = dict(maxCorners = 1000,
qualityLevel = 0.3,
minDistance = 7,
blockSize = 7)
lk_params = dict(winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
#image 1
image_1=cv2.imread("/Users/user/Desktop/Test_images/Test_image.jpg")
image_1=cv2.resize(image_1,(640,480))
gray_1=cv2.cvtColor(image_1,cv2.COLOR_BGR2GRAY)
p1=cv2.goodFeaturesToTrack(gray, mask = None, **feature_params)
#image read in
image_2=cv2.imread("/Users/user/Desktop/Test_images/Test_image.jpg")
image_2=cv2.resize(image_2,(640,480))
gray_2 = cv2.cvtColor(image_2,cv2.COLOR_BGR2GRAY)
p2, st, err = cv2.calcOpticalFlowPyrLK(gray_1, gray_2, p1, None, **lk_params)
#convert the old points to 3d
zeros=np.zeros([len(p1),1],dtype=np.float)
old_3d=np.dstack((p1, zeros))
#get rotational and translation vector
blank,rvecs, tvecs, inliers = cv2.solvePnPRansac(old_3d, p2, mtx, dist)
rad=180/math.pi
roll=rvecs[0]*rad
pitch=rvecs[1]*rad
yaw=rvecs[2]*rad
print(roll)
print(pitch)
print(yaw)
print(tvecs)
function(mtx,dist)
rvec (roll, pitch and yaw)
[ 0.35305807]
[ 2.95965708]
[ 0.10954427]
tvec (x,y,x ???)
[[ -668.42397254]
[ -387.32180857]
[ 1180.94652875]]
. 그러나 그것들은 꽤 높습니다. 아래의 샘플 출력을보십시오. 또한 알려진 이미지가있는 다른 이미지의 벡터는 매우 잘못되었습니다.
내 질문 소리는 내 소리인가? 나는이 문제에 올바르게 접근 했습니까? 나는 정확하게 점수를 매겼습니까? 소음 수준이 정상입니까, 아니면 제가 할 수있는 일이 있습니까?
저에게 맞지 않습니다. 객체의 프레임에서 표현 된 3D 점을 카메라 프레임으로 표현 된 3D 점으로 변환 할 수있는 회전 및 변환 인 전체 카메라 포즈를 계산하려면 3D/2D 점이 필요합니다. 3D 점은 대상 프레임에서 표현 된 점이어야합니다. 2D 점은 (추정 된) 카메라 포즈 및 내장 + 왜곡 매개 변수에 따라 현재 이미지 평면에 투영 된 해당 3D 점이어야합니다. – Catree
네가하는 말을 따르고 있는데 어떻게 할 수 있니? 워크 플로우는 어떻게 생겼을까요? 어떤 OpenCV 기능이 그렇게할까요? – Jake3991