gpt4 book ai didi

c++ - 在光流路径区域周围创建边界框

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:21 24 4
gpt4 key购买 nike

我已经使用 cv::calcOpticalFlowFarneback 在 openFrameworks 中使用 ofxOpenCv 计算当前和先前视频帧中的光流。

然后我在顶部绘制带有光流场的视频,然后绘制 vector 以显示高于特定阈值的区域中的运动流。

我现在要做的是为这些运动区域创建一个边界框并获取质心并将该 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 );
}
}
}
}

最佳答案

对于您的问题,没有简单的答案。这是一个建议的解决方案。它涉及多个步骤,但如果您的域足够简单,则可以简化它。

对于每一帧,

  1. 将流计算为两个图像 flow_x,flow_y 使用 farneback 方法将当前帧与前一帧进行比较。(您似乎在代码中这样做)

  2. 将流图像转换为 hsv 图像,其中每个像素的色调分量表示流的角度atan2(flow_y/flow_x),每个像素的值分量表示大小流 sqrt(flow_x\*\*2 + flow_y\*\*2)

  3. 在上述步骤中,使用您的阈值机制来抑制幅度低于特定阈值的流像素(使它们变黑)。
  4. 根据颜色范围分割 HSV 图像。您可以使用有关您的域的先验信息,或者您可以获取色调分量的直方图并识别突出的色调范围以对像素进行分类。作为此步骤的结果,您可以为每个像素分配一个类别。

  5. 将属于每个类别的像素分成多个图像。属于分段类 1 的所有像素将转到图像 1,属于分段类 2 的所有像素将转到图像 2 等。现在每个分段图像都包含 HSV 图像中特定颜色范围内的像素。

  6. 将每个分割图像转换为黑白图像,并使用 opencv 的形态学操作使用连通性拆分为多个区域。 (连接的组件)。

  7. 找到每个连通分量的质心。

我找到了 this reference在这方面有所帮助。

关于c++ - 在光流路径区域周围创建边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42176120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com