Отметьте точки на контурной линии, используя OpenCV

Я хочу сделать набор точек на одинаковом расстоянии на линии края листа растения (как показано на изображении ниже). Я хочу сделать маленький квадрат красного цвета на линии края листа. Я сохраняю набор точек линии края листа как контур.

введите здесь описание изображения

Есть ли способ сделать это с помощью OpenCV/С++? (особенно мне нужен способ сохранить эти очки для будущего использования приложения)

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


person Grant    schedule 30.06.2014    source источник


Ответы (2)


Вам необходимо рассчитать приблизительноPolyDP для контура, который вы уже нашли, procPolyDP аппроксимирует многоугольные кривые с заданной точностью, где вы можете настроить параметр epsilon для получения желаемого результата.

См. здесь пример, как использовать procPolyDP.

person Haris    schedule 30.06.2014

  1. FindContours для извлечения контуров вашего изображения. (преобразуйте свое изображение в оттенки серого, примените двоичный порог и обнаружение осторожных краев, чтобы получить лучшие результаты.)

    вектор > контуры; cv::findContours(src_img, контуры, иерархия, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

  2. Нарисуйте все точки контура. Пример кода:

    cv::Mat draw = cv::Mat::zeros( 500 500, CV_8UC3 );

    интервал контур_ид = 1;

    for(int i = 0; i‹ контур[contour_id].size(); i++) { cout ‹‹ контур[contour_id][i] ‹‹ endl; cv::circle(draw,contour[contour_id][i],1,cv::Scalar(0,0,255)); }

Кроме того, вы также можете использовать ApproxPolyDP или PointPolygonTest. Функции Opencv для всех точек на контуре. См. полную информацию и пример кода здесь. Как вы можете прочитать по ссылке, эта функция возвращает расстояние, которое является отрицательным, когда точка находится вне контура, положительным, когда точка находится внутри, и нулевым, если точка находится на контуре. Поэтому вам нужно рисовать только точки, которые возвращают ноль.

С уважением

person Gujjar    schedule 30.06.2014