ошибка при применении вида фильтрации во временной области

0

Я использовал этот код для обнаружения круга в потоке.

      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 );
   }

На изображении есть только один круг. так что то, что у меня в векторе пары, является координатой центральной точки. поэтому вектор имеет только одно значение пары! (Вероятно)

Теперь я хочу применить некоторую фильтрацию в этот момент в последовательности кадров. Как и Bilateral 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;

Заранее спасибо..

Теги:
opencv
image-processing
video-streaming
video-processing

1 ответ

0
Лучший ответ

Эта:

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

делает "Вектор" вектором пар векторов ints. Вам не нужны вещи в паре, чтобы быть векторами, это не имеет смысла.

Лучше:

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 вдоль пути замените среднее положение позиций от NK до N + K (вы можете использовать средневзвешенное значение для создания временного FIR-фильтра с требуемыми характеристиками, а простой средний - это базовый фильтр нижних частот).

Чтобы создать промежуточные точки, используйте сплайны. В OpenCV нет встроенных сплайнов; но есть много библиотек. См.: Cubic Spline: интерполяция начала/конца сегмента

Этот метод полезен для сглаживания, но только на (закрытых) контурах: OpenCV, как использовать массивы точек для сглаживания и контуров выборки?

  • 0
    Благодарю. Я думал, что это не имеет значения, что я нахожусь в пространственной области или временной! если бы я применил вид фильтрации в пространственной области, это была бы пространственная фильтрация, а если бы я применил ее во временной области, это была бы временная фильтрация!
  • 0
    @aa: Это просто фильтрация изображений в OpenCV, извините, здесь нет «домена», большинство фильтров работают только с одним изображением. Пожалуйста, смотрите обновленный ответ для некоторых дополнительных предложений.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню