提取图片中任意形状的区域.doc

上传人:cn****1 文档编号:542436937 上传时间:2023-11-21 格式:DOC 页数:3 大小:277.01KB
返回 下载 相关 举报
提取图片中任意形状的区域.doc_第1页
第1页 / 共3页
提取图片中任意形状的区域.doc_第2页
第2页 / 共3页
提取图片中任意形状的区域.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《提取图片中任意形状的区域.doc》由会员分享,可在线阅读,更多相关《提取图片中任意形状的区域.doc(3页珍藏版)》请在金锄头文库上搜索。

1、提取图片中任意形状的区域 正在做一个基于内容的图像检索项目,客户要求可以让用户提取图片上的任意形状的子图作为输入。为了实现这个功能,花了不少精力,中间绕了不少圈子。现在问题总算解决了,把主要的思路记录一下,希望能帮到有同样需求的朋友。 由于这个项目使用了第三方的开源图像库opencv,所以这个功能也是借助opencv来实现的。 首先需要解决的是在图片中绘制曲线的问题,思路很简单,只需要响应鼠标事件通过描点、连线的方式就可以完成。在opencv中需要使用回调来响应鼠标事件,opencv中文站上有很好的示例,关键代码:#includecv.h#includehighgui.h#include#in

2、cludeIplImage*inpaint_mask=0;IplImage*img0=0,*img=0,*inpainted=0;CvPointprev_pt=-1,-1;voidon_mouse(intevent,intx,inty,intflags,void*zhang)if(!img)return;if(event=CV_EVENT_LBUTTONUP|!(flags&CV_EVENT_FLAG_LBUTTON)prev_pt=cvPoint(-1,-1);elseif(event=CV_EVENT_LBUTTONDOWN)prev_pt=cvPoint(x,y);elseif(even

3、t=CV_EVENT_MOUSEMOVE&(flags&CV_EVENT_FLAG_LBUTTON)CvPointpt=cvPoint(x,y);if(prev_pt.x=2?argv1:(char*)fruits.jpg;if(img0=cvLoadImage(filename,-1)=0)return0;printf(Hotkeys:ncvNamedWindow(image,1);img=cvCloneImage(img0);inpainted=cvCloneImage(img0);inpaint_mask=cvCreateImage(cvGetSize(img),8,1);cvZero(

4、inpaint_mask);cvZero(inpainted);cvShowImage(image,img);cvShowImage(watershedtransform,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(segImage.bmp,segImage);cvCopy(segImage,proc-img);cvReleaseImage(&segImage);cvDestroyWindow(KeyImage);效果如下:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号