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



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

      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只有一对值!(可能)

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

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;

提前谢谢。。

这:

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

使"向量"成为int的向量对的向量。你不需要这对中的东西是向量,这是没有意义的。

更好:

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中没有内置样条曲线;但是这里有很多图书馆。请参见:三次样条曲线:开始/结束段插值

此方法适用于平滑,但仅适用于(闭合)轮廓:OpenCV,如何使用点阵列对轮廓进行平滑和采样?

相关内容

最新更新