[opencv图像处理]利用cvCanny边缘检测和cvErode,cvDilate等,如何识别出物体的形状?

ahwhfei 2012-03-04 10:01:03
最近在做一个根据餐盘形状或颜色,自动结算的系统。在开发过程中遇到难题,特此在网上救助,希望高手帮帮,提示一下思路,或者有类似代码贴些代码。
我的问题是:
1)canny边缘只有1个像素宽,用默认的3x3结构元素腐蚀后就没有了。用什么样的结构元素,腐蚀,膨胀才能达到目的?
2)能不能利用cvHoughCircles()和cvApproxPloy()找出圆形和长方形?但是难点在于餐堆得太满,长方形形状被干扰了。
请高手提供思路。非常非常感谢!!!

以下是餐盘图片:
显示不全请点:http://hi.csdn.net/attachment/201203/4/32821_13308260183yJg.jpg

使用以下代码,得到的二值图如下:
pImg = cvCreateImage(cvSize(pOrgImg->width,pOrgImg->height), IPL_DEPTH_8U, 1);
cvCvtColor(pOrgImg, pImg, CV_BGR2GRAY);
cvSmooth(pImg, pImg, CV_MEDIAN, 3, 0, 0, 0);
cvThreshold(pImg,pImg,180.0,255,CV_THRESH_BINARY);

显示不全请点:http://hi.csdn.net/attachment/201203/4/32821_1330826515N6xU.jpg

我开始接这个项目的时候,想法是通过Canny边缘检测,获取边缘,然后进行形态学操作,去掉不想要的边缘,然后进行形状识别。获取每份菜餐盘的形状,直径等信息。
pImg = cvCreateImage(cvSize(pOrgImg->width,pOrgImg->height), IPL_DEPTH_8U, 1);
cvCvtColor(pOrgImg, pImg, CV_BGR2GRAY);
cvSmooth(pImg, pImg, CV_MEDIAN, 3, 0, 0, 0);
pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
int throld = 50;
cvCanny(pImg, pCannyImg, throld, throld*3, 3);
cvShowImage( "Canny", pCannyImg );

显示不全请点:http://hi.csdn.net/attachment/201203/4/32821_1330827072sesl.jpg



...全文
1549 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tinary3v0 2012-03-18
  • 打赏
  • 举报
回复
1.首先对图像进行扭斜校正(根据情况)
2.通过颜色去除不该有的颜色,保留盘子颜色(白色);
3.进行边缘提取
4.查找点序列中的矩形、椭圆等关心的形状。(OpenCV中有相应的函数)
5.对形状的大小、嵌套、等进行分析,剔除多余的形状,最终确定形状的个数、位置等信息。
最关键的两步第四步和第五步,可结合一些模糊数学等人工智能算法。
ahwhfei 2012-03-12
  • 打赏
  • 举报
回复
谢谢hblac~~,我看了"repfinder..."这篇论文,但是没怎么看懂,全是精华部分,感觉跳跃性很大。
那位高手帮帮忙,继续提示点思路。
ahwhfei 2012-03-08
  • 打赏
  • 举报
回复
多谢~~~我先找这篇文章看看。。。
ahwhfei 2012-03-07
  • 打赏
  • 举报
回复
是啊,所以才上csdn求高手指点来了。。。。
hblac 2012-03-07
  • 打赏
  • 举报
回复
看这篇文章RepFinder: Finding Approximately Repeated Scene Elements for Image Editing。分离出前景和背景后,用预先确定的模板去匹配,这样可以处理少量的重叠以及去除其他边界的干扰
fengbingchun 2012-03-05
  • 打赏
  • 举报
回复
盘子和盘子之间有的有重叠,不好处理呀

4,450

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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