2013-02-27 7 views
1

점 :: (x y)는 알려져 있습니다.평면의 변형 점

삼각형 영역 안에 포인트가 있습니다.
나는 처음과 마지막 위치의 정점 좌표를 알고있다. 나는 삼각형 영역 안에있는 모든 점들의 초기 좌표를 안다.

지금 삼각형 영역 내의 모든 점의 최종 좌표를 찾고 싶습니다.

아래 그림은 초기 및 최종 포지션의 포인트를 보여줍니다.

enter image description hereenter image description here

사람은 방법을 OpenCV와 C++ 플랫폼에서이 작업을 수행하는 방법을 말해 줄래?

임의 형상의 윤곽에도 사용할 수 있습니까? I 차원을 사용하고

답변

4

[u v]

  • matrixabcd
  • 의해 2 차원 선형 변환은 전체 변형 행렬 형태

    [ a b u] 
    M = [ c d v] 
        [ 0 0 1] 
    
    있을 것이다 벡터하여 계정을

    • 번역을 좌표
      1. 이 변환 A' = [x1' y1' 1]B'=[x2' y2' 1]C'=[x3' y3' 1] 후 자신의 위치와 비교 삼각형에서 3 점 A=[x1 y1 1]B=[x2 y2 1]C=[x3 y3 1]을 가져 가라. 아이디 EST : A' = M AB' = M B
      2. C' = M C 모든 입력에 x -> M x 적용되도록 변환 행렬 M를 얻을 수 있도록 수학을 수행하는 것은

      편집 포인트 : Translation in transformation matrix

      편집을 사용하여 매트릭스 M에 번역을 통합 : 그것은 당신의 수학이 당신에게 명확하지 않은 것처럼 보입니다.

      당신은 3 개 방정식은 다음과 같이 쓸 수 있다는 걸 것 :

      [x1' x2' x3']  [x1 x2 x3] 
      [y1' y2' y3'] = M [y1 y2 y3] 
      [1 1 1 ]  [1 1 1 ] 
      

      또는

      X' = M X 
      

      또는

      M = X . X'^-1 
      

      하고 예, OpenCV의이 행렬에 기능 inv()있다 .OpenCV의에서,

      given initial triangle vertices A, B, and C, and point p, 
      find barycentric coordinates (a,b,c) such that a+b+c=1 and p = a*A + b*B + c*C: 
          -> solve [A.x B.x C.x] [a]  [p.x] 
            [A.y B.y C.y] * [b] = [p.y] 
            [ 1 1 1 ] [c]  [ 1 ] 
      
      then, given new vertices D, E, and F, 
      resulting point q = a*D + b*E + c*F: 
          -> compute [q.x] = [D.x E.x F.x] * [a] 
             [q.y]  [D.y E.y F.y] [b] 
                   [c] 
      

      : 그래서

    +1

    그래서 무엇을 : 명시 적으로 먼저 아핀 행렬을 계산하는 것이 효율적/더 편리 할 수 ​​있으며,이를는 바로이 적용되는 응용 프로그램에 따라 따라 p_data의 크기 등)

    증가 세 번째 꼭지점 ?? 3 개의 꼭지점이 무작위로 옮겨져 있습니다 ... – 2vision2

    +1

    맞습니다. 나는 가능한 번역을 잊었다. – rds

    +2

    이제 6 개의 unknow 변수 (M은 4, T는 2)와 6 개의 방정식 (각 변환에 대해 2 * 3 변환)이 있습니다. Eveything good good :) – rds

    2

    수학적으로, 원래 삼각형의 각 점의 무게 중심 좌표를 계산하고, 새로운 좌표를 사용하여 위치로 다시 변환하여이 작업을 수행 할 수 있습니다

    float p_data[3] = 
        { p.x, 
        p.y, 
        1.0 
        }; 
    Mat_<float> p(3, 1, p_data); 
    
    float m_data[9] = 
        { A.x, B.x, C.x, 
        A.y, B.y, C.y, 
        1.0, 1.0, 1.0 
        }; 
    Mat_<float> M(3, 3, m_data); 
    
    Mat_<float> bary(3,1); 
    cv::solve(M, p, bary, DECOMP_LU); 
    
    float n_data[6] = 
        { D.x, E.x, F.x, 
        D.y, E.y, F.y 
        }; 
    Mat_<float> N(2, 3, n_data); 
    
    Mat_<float> result(2,1) = N * bary; 
    

    point_count 포인트를 동시에 매핑하려면 대신 p, baryresultpoint_count으로 설정하십시오 (while 에 대해 ..

    Mat_<float> Affine = N * M.inv(); 
    Mat_<float> result = Affine * p;