Я использовал этот код для обнаружения круга в потоке.
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;
Заранее спасибо..
Эта:
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, как использовать массивы точек для сглаживания и контуров выборки?