Haar 캐스케이드로 얼굴을 미리 감지 한 후 캠축 헤드 추적에서 실제 측정 값을받는 칼만 필터를 구현합니다. Haar 캐스 캐 이드의 머리 위치로 칼만 필터의 주 프리 및 스테이트 포스트 변수를 초기화하고 캠 셔프트를 수행하면서 칼만이 예측하고 올바른 것을 호출하여 부드럽게 처리합니다. 문제는 예측되고 수정 된 값이 항상 하얼 폭포에서 출발 한 값이라는 것입니다. 캠 쉬프트를하는 동안 상태 프리 또는 스테이트 포스트 변수를 업데이트해야합니까?칼만 예측 및 보정 시작 값과 동일
private CvKalman Kf ;
public CvMat measurement = new CvMat(2,1, MatrixType.F32C1);
public int frameCounter = 0;
public float[] A = {1,0,1,0, 0,1,0,1, 0,0,1,0, 0,0,0,1};
public float[] H = {1,0,0,0, 0,1,0,0};
public float[] Q = {0.0001f,0,0,0, 0,0.0001f,0,0, 0,0,0.0001f,0, 0,0,0,0.0001f};
public float[] R = {0.2845f,0.0045f,0.0045f,0.0455f};
public float[] P = {100,0,0,0, 0,100,0,0, 0,0,100,0, 0,0,0,100};
haar 캐스케이드를 수행하는 동안 initkalman이 한 번 호출되고 추적 창이 초기 머리 위치입니다.
void initKalman(CvRect trackinWindow){
Kf = new CvKalman (4, 2, 0);
Marshal.Copy (A, 0, Kf.TransitionMatrix.Data, A.Length);
Marshal.Copy (H, 0, Kf.MeasurementMatrix.Data, H.Length);
Marshal.Copy (Q, 0, Kf.ProcessNoiseCov.Data, Q.Length);
Marshal.Copy (R, 0, Kf.MeasurementNoiseCov.Data, R.Length);
Marshal.Copy (P, 0, Kf.ErrorCovPost.Data, P.Length);
measurement.mSet (0, 0, trackingWindow.X);
measurement.mSet (1, 0, trackingWindow.Y);
Kf.StatePost.mSet(0,0,trackingWindow.X);
Kf.StatePost.mSet(1,0,trackingWindow.Y);
Kf.StatePost.mSet(2, 0, 0);
Kf.StatePost.mSet(3, 0, 0);
}
나는 훌륭한 this에서 초기 헤드 position.The 사람을 반환 항상 윈도우에게이 작동하지 않는 실제 머리 위치
CvPoint processKalman(CvRect trackingwindow)
{
CvMat prediction = Cv.KalmanPredict(Kf);
CvPoint predictionPoint;
predictionPoint.X = (int)prediction.DataArraySingle [0];
predictionPoint.Y = (int)prediction.DataArraySingle [1];
Debug.Log (predictionPoint.X);
measurement.mSet (0, 0, trackingWindow.X);
measurement.mSet (1, 0, trackingWindow.Y);
CvMat estimated = Cv.KalmanCorrect(Kf,measurement);
CvPoint auxCP;
auxCP.X = (int)estimated.DataArraySingle [0];
auxCP.Y = (int)estimated.DataArraySingle [1];
return auxCP;
}
를 추적 지금 존재하고, 각 camshift 반복에 processKalman 함수를 호출 블로그는 예측 기능을 호출하기 전에 실제 측정 값으로 주정부를 변경하지만 예측 및 보정 된 값은 이제 각 프레임의 캠 위치 머리 위치와 동일합니다.
칼만 예측 및 수정 코드를 알려주십시오. 여기서 잘못 될 가능성이 있습니다 ... – MoonKnight
나는 opencvsharp 라이브러리에서 표준 방법을 사용합니다. 그러나 내가 말했듯이, 나는 국가의 전후 변수와 그것들의 초기화와 관련하여 무언가가 올바르지 않다고 생각한다. opencvsharp 래퍼를 사용하는 블로그에서 언급 한 사람 외에는 아무 것도 보지 못했기 때문에 표준 메서드의 내부 문제 일 수도 있습니다. 그것이 그렇다면 나는 당신이 제안한대로 내 자신의 방법을 만들 필요가 있다고 생각합니다. –
어쩌면, 그러나 위의 데이터 배열, 단일 지점을 볼 수 없습니다. 코스의 한 지점에 대해 필터를 실행하면 시작 상태 벡터가 다시 나타납니다. 칼만 필터의 전체 개념은 재귀 적이며, 신중한 시간에 관측 벡터와 관련된 상태 벡터를 찾는 '열차'자체라는 것입니다. 이것이 잘 알려진 라이브러리에서 나온 것이라면, 옳은 일을 할 가능성이 있습니다. 시계열 (1D 일 수도 있음) y_ {n} [nPoints]의 시계열이 필요하고 그에 대한 필터를 실행해야합니다. 나는 돌아가서 구현에 대해 더 많이 읽었을 것이다 ... – MoonKnight