2012-09-07 3 views
1

두 이미지 간의 아핀 변환을 계산할 때 opencv를 사용하고 있습니다. A와 B라고 가정 해 봅시다. A부터 B까지 추정하고 싶습니다. RANSAC을 구현해야합니다. 가능한 가장 좋은 평가. 지금까지 RANSAC에 대한 내 프레임 워크 (두 이미지와 해당 이미지의 키포인트가 이미 있다고 가정) :opencv warpAffine의 이상 값 테스트 번호

1 : 임의의 3 개의 일치 항목을 선택하고 A와 B의 일치 지점을 getAffineTransform ;

2 : warpAffine 함수를 사용하여 A에서 포인트를 왜곡하고 결과를 B.의 포인트와 비교하여 이상 치를 얻습니다. e;

3 : 샘플의 크기가 3 포인트 (getAffineTransform은 변환을 찾기 위해 3 포인트가 필요함)를 고려할 때 아웃 사이더 비율이 e 인 경우, RANSAC를 실행해야하는 횟수를 찾을 수 있습니다. 좋은 추정을 발견 할 확률, N 회;

4 : 가장 작은 이상치 비율로 변환을 유지하면서 1 및 2 단계를 반복합니다.

기본 아이디어는 괜찮은 것 같지만 실행에 문제가 있습니다. 구체적으로 2 단계입니다. 문제는 특정 아웃 라이어 수를 테스트 할 수 있는지 잘 모르겠습니다. warpAffine을 사용하여 A와 B의 점을 매핑하는 방법에 대해 생각했지만 실제로는 기능이 작동하지 않을 것이라고 확신합니다. 점의 매트 (M은 매트이며 M은 점의 수와 각각 좌표를 x 및 y 좌표로 표시)를 맵핑하려는 포인트 세트 대신 Image로 설정하십시오. 어떻게해야합니까?

저는 opencv 2.4.2를 C++과 함께 사용하고 있습니다.

답변

0

내 자신의 질문에 답하면 사실 실제로 그 방법을 찾았습니다. 나는 그것을하는 것이 가장 좋은 방법이라고 확신하지 못하지만, 지금까지 해본 테스트를 바탕으로 잘 작동하는 것 같습니다.

바와 같이

아핀 변환은 행렬 곱셈으로서 표현 될 수있는 변형이며, 여기

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine 설명했다. 따라서 변환을 적용하는 것은 getAffineTransform에서 얻은 행렬에 단순히 내 포인트를 곱하는 것으로 구성됩니다. 단일 점을 매핑하기 전에 매핑 할 점에 '1'을 추가하고이를 전치 (그래서 열 벡터가 있음) 한 다음 변환 행렬을 곱하여 매핑해야합니다.

|x1, x2, x3, ...., xM| 
|y1, y2, y3, ...., yM| 
| 1, 1, 1, ...., 1| 

및 변환 행렬을 곱 : 우리는 쉽게 우리는 형식의 3xM 포인트 매트릭스에 MX2 점 행렬을 변환하면 모든 지점이 매핑을 확장 할 수 있습니다! 나중에이 게시물의 편집 방법을 보여주기 위해 간단한 테스트 프로그램을 사용하여이 게시물을 편집 할 수 있습니다. 나는이 그것을 할 수있는 가장 효율적인 방법입니다, 그래서 사람이있는 경우 확실하지 않다

1 - Create a new 3 x M matrix consisting of ones with Mat::ones, named newPtMat 
2 - transpose my original point matrix, and keep it in a temp Mat 
3 - use temp.copyTo(newPtMat.rowRange(0, 2) 

다음

또한

, 사람들이 벡터를 추가하고 그것을 전치, 내가하고 있어요 더 나은 제안, 의견을 남겨주세요! 이 전 아핀 두 사진 사이 워프 변환 매트릭스를 찾기 위해 "findTransformsECC"라고 사용할 수있는 새로운 기능