나는 cv::calcOpticalFlowFarneback
을 사용하여 openFrameworks에서 ofxOpenCv를 사용하여 비디오의 현재 프레임과 이전 프레임의 옵티컬 플로를 계산했습니다.광학 플로우 필드 주위에 경계 상자 만들기
다음으로 광학 플로우 필드가있는 비디오를 그 위에 그려 넣은 다음 특정 임계 값을 초과하는 영역에서 동작 흐름을 나타내는 벡터를 그립니다.
내가 지금하고 싶은 것은 움직임 영역의 테두리 상자를 만들고 그 중점을 얻어 x
, y
위치를 추적 용 변수에 저장하는 것입니다.
이것이 도움이 될 경우 흐름 필드를 그리는 방법입니다.
if (calculatedFlow){
ofSetColor(255, 255, 255);
video.draw(0, 0);
int w = gray1.width;
int h = gray1.height;
//1. Input images + optical flow
ofPushMatrix();
ofScale(4, 4);
//Optical flow
float *flowXPixels = flowX.getPixelsAsFloats();
float *flowYPixels = flowY.getPixelsAsFloats();
ofSetColor(0, 0, 255);
for (int y=0; y<h; y+=5) {
for (int x=0; x<w; x+=5) {
float fx = flowXPixels[ x + w * y ];
float fy = flowYPixels[ x + w * y ];
//Draw only long vectors
if (fabs(fx) + fabs(fy) > .5) {
ofDrawRectangle(x-0.5, y-0.5, 1, 1);
ofDrawLine(x, y, x + fx, y + fy);
}
}
}
}
이것은 개념을 더 이해하는 데 도움이됩니다. 나는 Cv :: Mat가 움직임의 다른 벡터에서 삼각법을 처리한다고 생각합니다. 왜냐하면 두 픽셀을 모두 얻은 후에 이미지를 임계 값으로 설정해야하기 때문입니다. 고맙습니다. – Elliot