kazanOpenCV 0 Жалоба Опубликовано April 3, 2013 Доброго времени суток, возникла проблема с findContours. Вопрос в следующем: есть квадрат: contours[1]([4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })). Рисуем его на белом фоне черным цветом с черной заливкой. Убираем грани, т.е. уменьшаем каждую сторону квадрата на толщину 1 пиксел. С помощью cv::findContours( empty_image, contours_optimized,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); находим все контура на картинке, получаем: [0] [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) - искомый контур. [1] [4]({x=1 y=1 },{x=1 y=1078 },{x=1918 y=1078 },{x=1918 y=1 }) - контур по периметру картинки Вопрос, почему найденный контур [8]({x=10 y=11 },{x=11 y=10 },{x=109 y=10 },{x=110 y=11 },{x=110 y=109 },{x=109 y=110 },{x=11 y=110 },{x=10 y=109 }) отличается от [4]({x=10 y=10 },{x=110 y=10 },{x=110 y=110 },{x=10 y=110 })?? Т.е почему он находит контур как на рис.1, а не как на рис.2 строгий квадрат? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kilop 7 Жалоба Опубликовано April 4, 2013 CV_CHAIN_APPROX_NONE - попробуйте без аппроксимации сделать в findContours Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 4, 2013 Это видимо связано с установленным типом связности (4 или 8). У Вас, похоже, 8 - связные соседи. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано April 4, 2013 kilop, мне нужно чтобы прямые участки контура представлялись не поточечно, а отрезками, как раз для этого использую CV_CHAIN_APPROX_SIMPLE. Smorodov, а как мне тип связности поменять на 4? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 4, 2013 если findContours с CV_CHAIN_APPROX_NONE выдаст нормальные точки в углах, то потом можно самому точки преобразовать с 4-х связностью в отрезки. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано April 4, 2013 если findContours с CV_CHAIN_APPROX_NONE выдаст нормальные точки в углах, то потом можно самому точки преобразовать с 4-х связностью в отрезки. mrgloom, так я и использовал CV_CHAIN_APPROX_SIMPLE, чтобы исключить ручную обработку точек контура на предмет исключения прямых отрезков. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах