opencv 轮廓检测问题

yingzizizizizizzz 2015-03-24 03:45:04
小弟想实现运动目标的检测与追踪。检测部分用的是混合高斯模型建模,然后想用camshift算法来实现全自动的运动目标追踪,可是在查找轮廓这一步的时候怎么着查找到的都是0。contours为0。
...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
引用 8 楼 wangyaninglm 的回复:
[quote=引用 7 楼 yingzizizizizizzz 的回复:] [quote=引用 6 楼 wangyaninglm 的回复:] [quote=引用 5 楼 yingzizizizizizzz 的回复:] [quote=引用 3 楼 wangyaninglm 的回复:] 不是很懂,不过好像就是catch出来的那一帧没东西是么?
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助[/quote] 那你看看每个参数的要求,是不是参数没有传递正确,我估计你参数没传对[/quote] 我估计也是。查了输入应该是单通道二值化图像的。我这个输入是调用自带的gmm函数得到的前景图像,说是8-bit二进制图像,我觉得这个应该就是单通道二值化图像吧,可是就是不对。不知道我理解的对不。大神请指导。[/quote] 2值跟灰度不一样啊。。。。你再好好看看[/quote] 恩恩。刚刚二值化了下,然后查找到轮廓了。竟然犯了这么低级的错误。多谢大神
shiter 2015-03-24
  • 打赏
  • 举报
回复
引用 7 楼 yingzizizizizizzz 的回复:
[quote=引用 6 楼 wangyaninglm 的回复:] [quote=引用 5 楼 yingzizizizizizzz 的回复:] [quote=引用 3 楼 wangyaninglm 的回复:] 不是很懂,不过好像就是catch出来的那一帧没东西是么?
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助[/quote] 那你看看每个参数的要求,是不是参数没有传递正确,我估计你参数没传对[/quote] 我估计也是。查了输入应该是单通道二值化图像的。我这个输入是调用自带的gmm函数得到的前景图像,说是8-bit二进制图像,我觉得这个应该就是单通道二值化图像吧,可是就是不对。不知道我理解的对不。大神请指导。[/quote] 2值跟灰度不一样啊。。。。你再好好看看
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
引用 6 楼 wangyaninglm 的回复:
[quote=引用 5 楼 yingzizizizizizzz 的回复:] [quote=引用 3 楼 wangyaninglm 的回复:] 不是很懂,不过好像就是catch出来的那一帧没东西是么?
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助[/quote] 那你看看每个参数的要求,是不是参数没有传递正确,我估计你参数没传对[/quote] 我估计也是。查了输入应该是单通道二值化图像的。我这个输入是调用自带的gmm函数得到的前景图像,说是8-bit二进制图像,我觉得这个应该就是单通道二值化图像吧,可是就是不对。不知道我理解的对不。大神请指导。
shiter 2015-03-24
  • 打赏
  • 举报
回复
引用 5 楼 yingzizizizizizzz 的回复:
[quote=引用 3 楼 wangyaninglm 的回复:] 不是很懂,不过好像就是catch出来的那一帧没东西是么?
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助[/quote] 那你看看每个参数的要求,是不是参数没有传递正确,我估计你参数没传对
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
引用 3 楼 wangyaninglm 的回复:
不是很懂,不过好像就是catch出来的那一帧没东西是么?
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
恩恩。就是cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);这个函数应该能检测出轮廓的,可是contours是0、contours是用来存储轮廓的。查了好多资料都是这样查找轮廓的……为什么我这就是0了。大神求帮助
shiter 2015-03-24
  • 打赏
  • 举报
回复
不是很懂,不过好像就是catch出来的那一帧没东西是么?
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
大神快来啊
yingzizizizizizzz 2015-03-24
  • 打赏
  • 举报
回复
问题补充:

代码如下:
while(capture.read(img2))
{
//update the model
bg_model(img2, foreground2, update_bg_model ? 0.005 : 0);//计算前景img2图像,其中输出foreground2为8-bit二进制图像,第3个参数为学习速率
medianBlur(foreground2,foreground2,5);
morphologyEx(foreground2,foreground2,cv::MORPH_DILATE,se);//腐蚀操作,se是 InputArray参数
//Mat bin;
//cvThreshold(foreground2, bin, 100, 255, CV_THRESH_BINARY);
//cvtColor(foreground2, foreground2, CV_BGR2GRAY);
//检索前景中各个连通分量的轮廓
foreground2.copyTo(bw);
vector<vector<Point>> contours;
cv::findContours(bw,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//cv::RETR_EXTERNAL,cv::CHAIN_APPROX_NONE
//CV_RETR_EXTERNAL表示只检测外轮廓,CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1
cv::cvtColor(img2,hsv,cv::COLOR_BGR2HSV);
vecImg.clear();
vecImg.push_back(hsv);
for(int k=0;k<contours.size();++k)
{
//第k个连通分量的外接矩形框
if(cv::contourArea(contours[k])<cv::contourArea(contours[0])/5)
break;
rt=cv::boundingRect(contours[k]);//得到轮廓的外包络矩形
mask=0;
mask(rt)=255;

//统计直方图
cv::calcHist(vecImg,vecChannel,mask,hist,vecHistSize,vecRange);
cv::minMaxLoc(hist,0,&maxVal);//查找数组和子数组的全局最大值
hist=hist*255/maxVal;
//计算反向投影图
cv::calcBackProject(vecImg,vecChannel,hist,backP,vecRange,1);
//camshift跟踪位置
cv::Rect search=rt;
cv::RotatedRect rrt=cv::CamShift(backP,search,cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS,10,1));
//(反向投影,初始搜索窗口,确定窗口搜索停止的准则(迭代次数为10))
cv::Rect rt2=rrt.boundingRect();
rt&=rt2;

//跟踪框画到视频上
cv::rectangle(result,rt,cv::Scalar(0,255,0),2);
}
imshow("foreground", foreground2);
imshow("跟踪结果",result);


运行结果如图:

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧