В чем разница между (CountNonZero) и (Moment M00) и (ContourArea) в OpenCV? - PullRequest
2 голосов
/ 18 апреля 2020

Если у меня есть двоичное изображение 3x3 и в местах (x, y) есть контур: (0,0), (0,1), (1,0), (1,1)

Я получаю контур с помощью метода findContours.

Я хочу получить площадь этого контура:

  • с CountNonZero: 4
  • с ContourArea: 1
  • с Моментом M00: 1

Каков правильный ответ и в чем разница между ними?

Этот контур квадратный, поэтому площадь равна 2 * 2 = 4

Так почему ContourArea равно 1?

Я использую EmguCV, и это мой код:

VectorOfVectorOfPoint cont = new VectorOfVectorOfPoint();

    Image<Gray, byte> img = new Image<Gray, byte>(3,3);

    img[0, 0] = new Gray(255);
    img[0, 1] = new Gray(255);
    img[1, 0] = new Gray(255);
    img[1, 1] = new Gray(255);
    CvInvoke.FindContours(img, cont, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

    Moments m = CvInvoke.Moments(cont[0], true);
    Console.WriteLine(CvInvoke.ContourArea(cont[0]));

    CvInvoke.Imshow("ss", img);
    CvInvoke.WaitKey(0);

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

Мне не известны детали реализации, но я подозреваю, что «контур» - это многоугольник, который проходит от центра пикселя к центру пикселя вокруг объекта. Этот многоугольник меньше набора пикселей, каждое ребро перемещено внутрь на половину расстояния в пикселях.

Это соответствует площади блока пикселей 2x2, измеряемой как 1 пиксель.

Если вы хотите измерить площадь, не используйте функцию контура. Используйте анализ подключенных компонентов (маркировку объектов) и подсчитайте количество пикселей в каждом подключенном компоненте.


OpenCV не предназначен для точного количественного определения, и в нем есть много вещей, которые не имеют смысла для меня.

2 голосов
/ 18 апреля 2020

В соответствии с ответом Криса , контур в вашем случае - это квадрат, длина стороны которого равна 1 пикселю ==> площадь = 1 квадрат в квадрате.

Вот как изображение и контур будет выглядеть так:

image: 
 [[255 255   0]
 [255 255   0]
 [  0   0   0]]

contour: 
 [[[0 0]]

 [[0 1]]

 [[1 1]]

 [[1 0]]]

area: 
1.0
...