1

OpenCV 2.4.2를 실행 중입니다.3D 재구성을위한 OpenCV 보정되지 않은 카메라 수정

내 프로젝트는 3D 얼굴 인식으로 구성됩니다.

수정되지 않은 카메라으로 촬영 한 이미지 쌍으로 3D 모델을 만들려고합니다. 목표는 식별 프로세스에 사용할 3D 기능을 얻는 것입니다.

나는 카메라를 보정하고 교정하려고하는데 좋은 결과를 얻지 못했습니다. 나는 다음과 같이했다 : 호모 그래피 행렬 를 얻기 위해 "stereoRectifyUncalibrated"중고 - - "findFundamentalMat" 에 기본 매트릭스 덕분에 계산 된 - 2 개 이미지 기능 사이에서 발견 대응 - - 추출 서핑은 2 개 이미지 에서 제공 을 사용 " warpPerspective "를 첫 번째 이미지와 첫 번째 호모 그래피 행렬을 사용하여 결과를 확인합니다.

내가 아주 나쁜 결과를 가지고 내가 지금 무엇을 해야할지하지 않습니다

...

는 그 알고리즘을 맞습니까? 어떠한 제안?

얼굴 인식을 향상시키는 데 사용할 수있는 어떤 종류의 3D 기능입니까? 여기 교정 코드

는 :

/// Conversione di 1 vettore di keypoints in 2 vettori di Point2f 
vector<int> pointIndexesLeft; 
vector<int> pointIndexesFront; 

for (vector<DMatch>::iterator it= matches_FL.begin(); it!= matches_FL.end(); ++it) { 
    // Estrazione degli indici 
    pointIndexesLeft.push_back(it->queryIdx); 
    pointIndexesFront.push_back(it->trainIdx); 
} 

// Convrsione dei keypoints in Point2f 
vector<cv::Point2f> selPointsLeft, selPointsFront; 
KeyPoint::convert(keypoints_left,selPointsLeft,pointIndexesLeft); 
KeyPoint::convert(keypoints_front,selPointsFront,pointIndexesFront); 

// Calcolo della matrice fondamentale 
Mat F = findFundamentalMat(
          Mat(selPointsFront), // points in first image 
          Mat(selPointsLeft), // points in second image 
          CV_FM_RANSAC);  // 8-point method 


/// Rettifico la camera 
Mat H1,H2; 
stereoRectifyUncalibrated(selPointsFront, selPointsLeft, F, img_front.size(), H1, H2,3); 

Mat out_right= Mat::zeros(img_front.rows, img_front.cols, img_front.depth()); 
Mat out_left= Mat::zeros(img_left.rows, img_left.cols, img_front.depth()); 

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 

imshow("out_right", out_right); 
imshow("out_left", out_left); 

모든 처음 탐지/식별

답변

2

먼저 3 차원 복원과 아무 상관이 사전에 감사합니다. 교정되지 않은 카메라의 객체를 실제로 3D로 재구성하고자한다면 일반적으로 두 가지 옵션이 있습니다.

1) 먼저 보정 패턴 (일반적으로 체스 같은 패턴)을 사용하여 카메라를 보정합니다. camera_calibration.cpp 예제를 참조하십시오.

2) 보정과 동시에 3D 재구성을 수행 할 수 있으며 가장 간단한 프로세스는 다음과 같습니다. 첫 번째 추출 피쳐 포인트 (피쳐)를 ANY 피쳐 검출 알고리즘을 사용하여 각각의 장점과 단점이 있지만 발견 된 특징에 대한 설명자를 추출하고, 두 개의 조건부 사진의 설명자를 일치시키고, 기본 행렬 F를 찾고, F에서 두 개의 투영 행렬 (3x4 행렬)을 추출하고, 일치하는 특징을 삼각형 화 한 다음 재검사로 재귀 적으로 진행하십시오 : 이미 계산 된 3D 포인트와 새 사진의 일치 된 특징을 사용하여 카메라 매트릭스 (내부 및 외부 매트릭스 모두)를 계산하고 새로운 사진으로 가져온 새로운 기능을 삼각 화하며 전체 재구성 된 번들 조정을 수행하십시오 공간 (카메라와 3D 점).

행운을 빈다.

+0

카메라가 온라인 데이터 세트에서 왔기 때문에 카메라를 보정 할 방법이 없으므로 내장 및 외재 측정 매트릭스를 계산할 수 없습니다. 이미 2 장의 이미지를 계산했습니다. 그럼 내가 F 매트릭스와 "stereoRectifyUncalibrated"H1과 H2와 함께 그리고 disparity map.I "disroity map과"imaginary "Q matrix로부터"reprojectImageTo3D "를 계산했다. (나는이 행렬을 어떻게 만들지 모르겠다. 단위 행렬). Triangulate의 의미는 무엇입니까? 좀 더 구체적으로 표현해 주실 수 있습니까? 저는 식별을 위해 3D 기능을 사용하고 싶습니다 (어떤 기능 사용에 대한 아이디어가 있다면). – Gappa

0

을 당신이 얼굴 이미지를이 방법으로 달성하려고하지 않도록 것입니다 입력해도, 나는 당신의 접근 방식에 다음과 같은 문제를 참조하십시오.당신은 호모 그래피는 H1, H2 행렬 찾을 때까지

다 잘하지만 그 이후 : 이후, warpPerspective on opencv doc

가 WARP_INVERSE_MAP 플래그를 불가 :

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 
 
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);

은 참조를 참조하십시오 H1은 앞으로의 호모 그래피이고 후진은 아닙니다. 이 플래그를 사용하지 않고 조정되지 않은 카메라 이미지를 사용하면 올바른 결과를 얻습니다. 여러 번의 반복을 통해 기본 매트릭스를 일관되게 식별 할 수있는 한 보정되지 않은 카메라를 사용할 때 실제로 문제가 없습니다.

시험해보고 효과가 있는지 알려주십시오.