为什么我没有使用 OpenCV 获得正确的轮廓区域
Why am I not getting the correct contour area using 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;
}
另外,我注意到等高线中的几个点是重复的(我不确定为什么),这可能会导致面积计算不正确。
也许是因为你的轮廓没有闭合?
更新:我看到你正在喂它一个精明的操作的结果。我会在具有非常明确的闭合形状的图像上尝试代码,以测试代码并排除特定轮廓中的问题。类似于时刻教程中使用的内容。
也许这个讨论会有所帮助。
因为您的图像没有轮廓,只有一系列绿色像素和背景。您需要关闭轮廓才能获得轮廓区域。
更正:
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;
}
相关文章:
- 将QGraphicsItem的移动区域限制在多边形区域内
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 提升区域设置规范化带状字符,但不规范化重音
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 英特尔将指令存储在重叠的内存区域
- 如何给主窗口区域DKGRAY_BRUSH?
- 矢量擦除多个区域,2 x 擦除与单个分配?
- 错误:创建对象后无法分配区域
- 是否有任何区域设置会影响宽字符编码?
- GTKMM:拍摄绘图区域的屏幕截图?
- GTKMM:如何将键盘事件附加到绘图区域?
- 在 mmap'ed 区域上使用 memcpy 崩溃,for 循环不会
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- 当DPI感知,全屏和无框时,客户区域在WM_NCACTIVATE上擦除
- OpenCV C++:按轮廓区域对轮廓进行排序
- 为什么我没有使用 OpenCV 获得正确的轮廓区域
- 绘制轮廓,同时删除较小的区域