在时域中应用一种过滤时出错

时间:2013-11-27 14:00:17

标签: c++ opencv image-processing video-streaming video-processing

我使用此代码检测流中的圆圈。

      vector<Vec3f> circles;
  /// Apply the Hough Transform to find the circles
   HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows/8, 200, 100, 0, 0 );
 for( size_t i = 0; i < circles.size(); i++ )
 {
      Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
      Vector.push_back(std::make_pair(center.x,center.y)); 
      int radius = cvRound(circles[i][2]);
      // circle center
      circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
      // circle outline
      circle( src, center, radius  Scalar(0,0,255), 3, 8, 0 );
   }

图像中只有一个圆圈。所以,我在配对值矢量中所拥有的是中心点的坐标。所以,Vector只有一对价值!(Probabely)

现在我想在帧的序列中对这一点应用一种过滤。像双边过滤器一样 但是我得到了内存分配错误!!(虽然在这种情况下我没有使用指针)

cv::bilateralFilter ( Vector , Output, 8, 8*2, 8/2 );  

这就是我在头文件中的内容:

std::vector< std::pair< std::vector<int>, std::vector<int> > > Vector;
std::vector< std::pair< std::vector<int>, std::vector<int> > > Output;

提前致谢..

1 个答案:

答案 0 :(得分:0)

此:

std::vector< std::pair< std::vector<int>, std::vector<int> > > Vector;

使“向量”成为整数向量的向量。你不需要对中的东西是向量,这是没有意义的。

更好:

std::vector< std::pair<int, int> > CenterPoints;

接下来的问题,“现在我想在帧序列中对这一点应用一种过滤” - 好吧,但OpenCV中的双边滤波器可以处理图像,而不是像点序列或类似物。我想你想要平滑点所描述的曲线,双边滤波器不能为你做那个。

无论如何,这段代码:

cv::bilateralFilter ( Vector , Output, 8, 8*2, 8/2 ); 

失败,因为bilateralFilter()期望Mat第一个和第二个参数(即:图像)。

点击示例代码: http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html

Mat src; Mat dst;
bilateralFilter ( src, dst, i, i*2, i/2 );

修改

如果我理解了这个问题,你会在连续的帧中找到一个圆圈然后试图找到一个平滑的圆心运动路径?你需要定义什么是“平滑”。例如,您可以尝试将样条拟合到运动中,或者执行某种低通滤波器,或者......

最简单的解决方案:对于沿路径的点N,用点N-K到N + K的位置的平均值替换(可以使用加权平均值,以产生具有期望特性的时间FIR滤波器;简单平均值是基本低通滤波器)。

要创建中间点,请使用样条线。 OpenCV中没有内置样条线;但是有很多图书馆。请参阅:Cubic Spline : Start/End Segment interpolation

此方法对于平滑非常有用,但仅适用于(闭合)轮廓:OpenCV, how to use arrays of points for smoothing and sampling contours?