- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
提取图片中任意形状的区域
提取图片中任意形状的区域
????? 正在做一个基于内容的图像检索项目,客户要求可以让用户提取图片上的任意形状的子图作为输入。为了实现这个功能,花了不少精力,中间绕了不少圈子。现在问题总算解决了,把主要的思路记录一下,希望能帮到有同样需求的朋友。
????? 由于这个项目使用了第三方的开源图像库opencv,所以这个功能也是借助opencv来实现的。
????? 首先需要解决的是在图片中绘制曲线的问题,思路很简单,只需要响应鼠标事件通过描点、连线的方式就可以完成。在opencv中需要使用回调来响应鼠标事件,opencv中文站上有很好的示例,关键代码:
#include?cv.h#include?highgui.h#include?stdio.h#include?stdlib.hIplImage*?inpaint_mask?=?0;IplImage*?img0?=?0,?*img?=?0,?*inpainted?=?0;CvPoint?prev_pt?=?{-1,-1};void?on_mouse(?int?event,?int?x,?int?y,?int?flags,?void*?zhang){??if(?!img?)???return;??if(?event?==?CV_EVENT_LBUTTONUP?||?!(flags??CV_EVENT_FLAG_LBUTTON)?)????prev_pt?=?cvPoint(-1,-1);??else?if(?event?==?CV_EVENT_LBUTTONDOWN?)????prev_pt?=?cvPoint(x,y);??else?if(?event?==?CV_EVENT_MOUSEMOVE??(flags??CV_EVENT_FLAG_LBUTTON)?)??{????CvPoint?pt?=?cvPoint(x,y);????if(?prev_pt.x??0?)????prev_pt?=?pt;????cvLine(?inpaint_mask,?prev_pt,?pt,?cvScalarAll(255),?5,?8,?0?);????cvLine(?img,?prev_pt,?pt,?cvScalarAll(255),?5,?8,?0?);????prev_pt?=?pt;????cvShowImage(?image,?img?);??}}int?main(?int?argc,?char**?argv?){???char*?filename?=?argc?=?2???argv[1]?:?(char*)fruits.jpg;???if(?(img0?=?cvLoadImage(filename,-1))?==?0?)?????return?0;???printf(?Hot?keys:?\n???cvNamedWindow(?image,?1?);???img?=?cvCloneImage(?img0?);???inpainted?=?cvCloneImage(?img0?);???inpaint_mask?=?cvCreateImage(?cvGetSize(img),?8,?1?);???cvZero(?inpaint_mask?);???cvZero(?inpainted?);???cvShowImage(?image,?img?);???cvShowImage(?watershed?transform,?inpainted?);???cvSetMouseCallback(?image,?on_mouse,?0?);???}
效果如下:
?????????????
???? ??? 第二步,利用封闭曲线提取图形,时间和精力都主要浪费在这一块了,最开始的想法是通过扫描线的方法获取,但最终做出来的效果差强人意,连自己这关都过不了。最后几经转折,找到了这样一个函数cvFloodFill(),这个函数可根据边界填充图像连通域,正是我所需要的。关键代码:
????????if(event?==?CV_EVENT_RBUTTONUP)????{????????cvFloodFill(maskImg,cvPoint(x,y),cvScalarAll(255));????????cvSaveImage(maskImg.bmp,maskImg);????????IplImage?*segImage=cvCreateImage(cvGetSize(img),8,3);;????????cvCopy(img,segImage,maskImg);????????cvSaveImage(se
您可能关注的文档
最近下载
- 成都市金牛区2020-2021学年下学期一年级期末考试语文试卷(部编版).pdf VIP
- 儿科“一科一品”之做有温度的护理人.pptx VIP
- 2025年广州数学中考试题及答案.doc VIP
- 中文释义 PASS图解速记高中词汇正序版.xlsx VIP
- 辅警招聘考试公安基础知识(情景分析题)模拟试卷3(题后含答案及解析).pdf VIP
- 工程质量风险分级管控清单 .pdf VIP
- 生物医学工程先进制造:第一章 绪论-2015.ppt VIP
- 培养员工归属感培养员工归属感.ppt VIP
- 古方上篇后八方.张志峰老师讲解和答疑2016.3.5.doc VIP
- JingChaDaXue《灭火救援指挥》期末试卷(A)参考答案.docx VIP
文档评论(0)