OpenCV中(CountNonZero)与(Moment M00)和(ContourArea)之间有什么区别?

问题描述 投票:2回答:2

[如果我有一个3x3二进制图像,并且在(x,y)位置有一个轮廓:(0,0),(0,1),(1,0),(1,1)

我通过findContours方法获得轮廓。

我想得到这个轮廓的区域:

  • with 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);
opencv image-processing emgucv opencv-contour opencv3.1
2个回答
2
投票

我不知道实现细节,但我怀疑“轮廓”是一个围绕对象围绕像素中心的多边形。此多边形小于一组像素,每个边缘向内移动半个像素距离。

这与将2x2像素块的面积测量为1像素一致。

如果要测量面积,请不要使用轮廓功能。使用连接的组件分析(对象标记),并计算每个连接的组件中的像素数。


OpenCV并非旨在进行精确的量化,其中有很多东西对我来说没有意义。


0
投票

Cris's answer相关,您的轮廓是一个边长为1像素==>面积= 1像素平方的正方形。

这是图像和轮廓的外观:

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

contour: 
 [[[0 0]]

 [[0 1]]

 [[1 1]]

 [[1 0]]]

area: 
1.0
© www.soinside.com 2019 - 2024. All rights reserved.