[如果我有一个3x3二进制图像,并且在(x,y)位置有一个轮廓:(0,0),(0,1),(1,0),(1,1)
我通过findContours
方法获得轮廓。
我想得到这个轮廓的区域:
正确答案是什么,它们之间有什么区别?
此轮廓为正方形,所以面积为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);
我不知道实现细节,但我怀疑“轮廓”是一个围绕对象围绕像素中心的多边形。此多边形小于一组像素,每个边缘向内移动半个像素距离。
这与将2x2像素块的面积测量为1像素一致。
如果要测量面积,请不要使用轮廓功能。使用连接的组件分析(对象标记),并计算每个连接的组件中的像素数。
OpenCV并非旨在进行精确的量化,其中有很多东西对我来说没有意义。
与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