2017-12-05 39 views
1

저는 OpenCV를 파이썬과 함께 사용하여 비디오 스트림에서 카메라 포즈를 추적하려고합니다. 두 이미지 사이의 포즈를 테스트 환경으로 결정하는 코드 샘플이 있습니다. 이미지에OpenCV 및 Python으로 카메라 포즈 추정

  1. 읽기 및/크기 조정을 회색으로 변환 :

    여기에 전체적인 흐름이있다.

  2. 두 이미지 모두에서 cv2 goodfeaturestotrack 기능을 추출합니다.

  3. 일치하는 점을 찾으려면 cv2 calcOpticalFlowPyrLK를 사용하십시오.
  4. 0으로 설정된 모든 점에 대해 z로 p1 지점 (시작 이미지)을 (x, y, z)로 변환하십시오.
  5. 회전 및 변환 벡터를 얻기 위해 cv2 PnPRansac을 확인하십시오.
  6. 각도를 라디안에서 각도로 변환합니다.
  7. 내가 제로에 가까운 것으로 회전 및 변환 벡터를 기다리고 있었다이 샘플 계산을 실행하는 데 정확히 동일한 이미지를 사용하고 있다는 사실을 감안할 때
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]] 

. 그러나 그것들은 꽤 높습니다. 아래의 샘플 출력을보십시오. 또한 알려진 이미지가있는 다른 이미지의 벡터는 매우 잘못되었습니다.

내 질문 소리는 내 소리인가? 나는이 문제에 올바르게 접근 했습니까? 나는 정확하게 점수를 매겼습니까? 소음 수준이 정상입니까, 아니면 제가 할 수있는 일이 있습니까?

+0

저에게 맞지 않습니다. 객체의 프레임에서 표현 된 3D 점을 카메라 프레임으로 표현 된 3D 점으로 변환 할 수있는 회전 및 변환 인 전체 카메라 포즈를 계산하려면 3D/2D 점이 필요합니다. 3D 점은 대상 프레임에서 표현 된 점이어야합니다. 2D 점은 (추정 된) 카메라 포즈 및 내장 + 왜곡 매개 변수에 따라 현재 이미지 평면에 투영 된 해당 3D 점이어야합니다. – Catree

+0

네가하는 말을 따르고 있는데 어떻게 할 수 있니? 워크 플로우는 어떻게 생겼을까요? 어떤 OpenCV 기능이 그렇게할까요? – Jake3991

답변

0

3D 구조, 즉 사용자가 매치 한 포인트의 3D 좌표를 모른다면 PnP를 사용할 수 없습니다.

카메라 내장 함수를 알고있는 경우 (평면 장면의 경우) 호모 그래피 또는 필수 매트릭스 (일반 장면의 경우)를 추정 한 다음 분해하여 회전 및 최대 스케일까지의 변환을 얻을 수 있습니다 . 그런 다음 번들 조정을 수행하여 찾은 포즈를 다듬을 수 있습니다.

원 샷 프로젝트 인 경우 자신의 솔루션을 코딩하는 대신 Blender와 같은 그래픽 환경을 사용하는 것이 더 빠릅니다. matchmove 튜토리얼보기 here 또는 here