Возвращаясь к первому Contour в Emgu после итерации по ним
Так что в основном я использую Emgu.CV для определения контуров, а после того, как получаю контуры изображения:
Contour<System.Drawing.Point> contours;
using (var stor = new MemStorage())
{
contours = gray_image.FindContours(
Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL,
stor);
}
Я в основном перебираю их, используя:
for (i = 0;
(context.Contours != null) && (i < this.config.MaxNumberContours);
context.Contours = context.Contours.HNext)
Могу ли я повторить их снова после этого? Документация говорит, что это похоже на указатель h_next в OpenCV, что это значит?
1 ответ
Во-первых, где вы нашли этот код для перебора контуров? Обычный способ, взятый с веб-страницы Emgu, выглядит примерно так:
for (Contour<Point> contours = cannyEdges.FindContours(); contours != null; contours = contours.HNext)
{
...
}
Контуры не индексируются, но каждый контур содержит указатель HNext, который указывает на следующий контур. Если HNext равен нулю, контуров больше нет.
Если вы хотите снова просмотреть их, вы можете использовать указатель HPrev, который указывает на предыдущий контур. Если HPrev равен нулю, вы достигли первого контура.
Другой вариант, если вы многократно проходите по контурам, это сохранить контуры в списке следующим образом:
var contourList = new List<Contour<Point>>()
for (Contour<Point> contours = cannyEdges.FindContours(); contours != null; contours = contours.HNext)
{
contourList.Add(contour);
}
Теперь вы можете использовать contourList для перебора контуров и обращаться к ним по индексу.