我通过从 flowX 和 flowY 创建新图像解决了我的问题。这是通过将 flowX 和 flowY 添加到新的 CV FloatImage 来完成的。
flowX +=flowY;
flowXY = flowX;
然后我能够从新创建的图像的像素中查找轮廓,然后我可以存储所有运动斑点的所有质心。
Like so:
contourFinder.findContours( mask, 10, 10000, 20, false );
//Storing the objects centers with contour finder.
vector<ofxCvBlob> &blobs = contourFinder.blobs;
int n = blobs.size(); //Get number of blobs
obj.resize( n ); //Resize obj array
for (int i=0; i<n; i++) {
obj[i] = blobs[i].centroid; //Fill obj array
}
我最初注意到,由于负值,仅在 x 轴和 y 轴的一个方向上跟踪运动。我通过调用 cv::Mat 中的 abs() 函数来更改光流的计算来解决此问题。
Mat img1( gray1.getCvImage() ); //Create OpenCV images
Mat img2( gray2.getCvImage() );
Mat flow;
calcOpticalFlowFarneback( img1, img2, flow, 0.7, 3, 11, 5, 5, 1.1, 0 );
//Split flow into separate images
vector<Mat> flowPlanes;
Mat newFlow;
newFlow = abs(flow); //abs flow so values are absolute. Allows tracking in both directions.
split( newFlow, flowPlanes );
//Copy float planes to ofxCv images flowX and flowY
IplImage iplX( flowPlanes[0] );
flowX = &iplX;
IplImage iplY( flowPlanes[1] );
flowY = &iplY;