绘制轮廓,同时删除较小的区域
Drawing Contours while removing smaller areas
我想在实时网络摄像头馈送中在我的手周围绘制轮廓。当我使用以下代码时,OpenCV 正在检测由于噪声、阴影等原因而导致的许多其他轮廓。
cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
cv::drawContours(fgimg,contours,-1,cv::Scalar(0,0,255),2);
我在网上找到了以下代码来删除无关紧要的小区域。
cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
for(int i=0;i<contours.size();i++)
{
if(contours[i].size() < 10000 && contours[i].size() > 0)
{
int size=cv::contourArea(contours[i]);
if(size>5000)
{
//Draw contour
vector<vector<Point> > tcontours;
tcontours.push_back(contours[i]);
cv::drawContours(fgimg,tcontours,-1,cv::Scalar(0,0,255),2);
}
}
}
但它根本没有绘制任何轮廓。我在 if(size>5000) 语句之后放了一个 cout 语句,看看这个语句是否成真,我得到了 Cout 输出。那么为什么没有轮廓呢?push_back功能有问题还是什么?
- 您确定要使用
CV_RETR_EXTERNAL
吗? -
if(contours[i].size() < 10000 && contours[i].size() > 0)
在这里没用 - 临时矢量
vector<vector<Point> > tcontours;
也没有任何意义
尝试:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(fgmask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
// draw contours:
Mat newImg = Mat::zeros(fgmask.size(), CV_8UC3);
for (unsigned int i = 0; i < contours.size(); i++)
{
if (contourArea(contours[i]) > 5000)
drawContours(newImg, contours, i, Scalar(0,0,255), 1, 8, hierarchy, 0);
}
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 当我按Enter或在其区域外单击鼠标时,如何从可编辑的Qcombobox中删除光标
- 绘制轮廓,同时删除较小的区域
- 用于删除图像中的非文本区域的开源代码