我已經使用cv::calcOpticalFlowFarneback
在openFrameworks中使用ofOOpenCv來計算當前和前一幀視頻中的光流。在光流路徑周圍創建邊界框
然後,我用光流場在上面繪製視頻,然後繪製矢量,顯示超過某個閾值的區域中的運動流。
我現在想要做的是創建一個運動區域的邊界框,並獲取質心,並將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