我想在现场网络摄像头中手绘轮廓。当我使用下面的代码时,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函数有什么问题吗?
答案 0 :(得分:0)
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);
}