为什么我没有使用OpenCV获得正确的轮廓区域?

时间:2013-11-11 05:36:06

标签: c++ opencv

我有以下轮廓:

https://drive.google.com/file/d/0B45BJEUVEkjseFd3X3RITzM5S3c/edit?usp=sharing

包含以下几点(按顺序打印):

https://drive.google.com/file/d/0B45BJEUVEkjsN3NIRU5lOFBDb00/edit?usp=sharing

然而,当我计算这个轮廓的面积(使用函数contourArea)时,我得到157,这对于该轮廓的大小来说太低了。我希望它成千上万。为什么轮廓区域计算不正确,我该如何解决?

以下是我用来计算图像所有轮廓区域的代码。感兴趣的轮廓是最后一个。我正在使用的原始图像在这里:

https://drive.google.com/file/d/0B45BJEUVEkjsbGhXM3E3UW1lZWs/edit?usp=sharing

int main(int argc, char* argv[])
{
  Mat imgOriginal = imread(argv[1], 0);

  if(imgOriginal.empty())
    return -1;

  Mat img;
  resize(imgOriginal, img, Size(640, 480));

  medianBlur(img, img, 11);
  Canny(img, img, 25, 100);

  vector< vector<Point> > contours;
  findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

  for (int i = 0; i < contours.size(); i++)
    cout << "Area " << i << ": " << contourArea(contours[i]) << endl;

  return 0;
}

另外,我注意到轮廓中的几个点是重复的(我不知道为什么),这可能导致区域计算错误。

4 个答案:

答案 0 :(得分:2)

也许是因为你的轮廓没有关闭?

更新:我看到你正在喂它一个精确操作的结果。我会在具有非常明确的闭合形状的图像上尝试代码来测试代码并排除特定轮廓中的问题。类似于the one used in the moments tutorial

答案 1 :(得分:2)

因为你的图像没有轮廓而是一系列绿色像素和背景。你需要关闭轮廓以获得轮廓区域。

答案 2 :(得分:1)

也许这discussion会有所帮助。

答案 3 :(得分:0)

更正:

  int main(int argc, char* argv[])
  {
  Mat imgOriginal = imread(argv[1], 0);

  if(imgOriginal.empty())
  return -1;

   Mat img;
   resize(imgOriginal, img, Size(640, 480));

   medianBlur(img, img, 11);
   Canny(img, img, 25, 100);

   vector< vector<Point> > contours;
   findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    cout << "Area " << ": " << contourArea(contours[1]) << endl;

    return 0;
   }