基于MFC和OpenCV的图像标注工具
2016-07-12 13:34
696 查看
深度学习时代,对于任何任务,性能提升最大的,不是算法,而是对数据的合理处理。
实现了什么:
一个简单的抠图工具,可以实现对于前景的提取,主动保存为jpg图片,也可以实现将一幅图像中的前景全部置为黑色,生成背景图片。
为什么需要这个工具:
在图像处理、模式识别等研究领域,经常需要涉及到对图像库的训练工作。当然,有一些国外的公开的数据集可以供大家使用。目前主流的标注有2种,一种是基于区域的标注(ALFW、FDDB、CIFAR等,本文要实现的标注也是这种),另一种是基于像素的标注(COCO、LABLEME、MSRC)。但是大部分的时候,需要自己的样本库(图像标注员干的事),因此,一个可以快速进行抠图的工具便很有必要。
主要开发环境:
VS2010,opencv2.4.9,MFC,c++
主要程序讲解:
批量导入图像操作LoadImages(stringdirName,
vector<string> &imagesFullPath)
注意这里默认是导入当前目录下的所有jpg格式图片,如果需要别的格式的可以将下面程序的jpg改为bmp,png等所需要的格式。
鼠标点下的响应函数OnLButtonDown(UINTnFlags,CPointpoint) CKouTuBiDoc*
pDoc = GetDocument();
鼠标滑动的相应函数OnMouseMove(UINTnFlags,CPointpoint)
鼠标弹起的响应函数OnLButtonUp(UINTnFlags,CPointpoint)
画框函数OnDraw(CDC*pDC)
Info.txt说明
第一行为原始图片的存储路径,第二行为扣取图片的存储路径,第三行为程序正在读取的图片个数(初始化第一次抠图为0),第四行为当前保存的图片个数(初始化第一次抠图为1)。例如我的程序的info.txt路径如下(我的程序在C盘根目录存放,info.txt存放在当前工程目录)
C:\KouTuBi\KouTuBi\data\
C:\KouTuBi\KouTuBi\dst\
0
1
读取该配置文件的目的:
可以实现任意路径的图像的读取和存储,同时,对于大量图像的扣取,当中途中断的时候,下次打开还可以接着原来的继续扣取。
程序运行说明:
程序运行后整体软件效果图如下图所示
![](http://img.blog.csdn.net/20160729090529257)
1.提取前景说明
运行程序,点击处理图片,提取前景,滑动鼠标选择框,如果选错的话,不会进行保存,当确认选对的话,再按下键盘的"Y"或者"y",就可以将图片保存在设置的目录下,并从1开始递增保存,同时生成ImageLists.txt文件(格式为图像路径扣取的目标个数 RECT坐标),例如我的ImageLists.txt文件如下。按"N"或者"n",就可以继续处理下一张。
C:\KouTuBi\KouTuBi\data\Chrysanthemum.jpg 0
C:\KouTuBi\KouTuBi\data\Desert.jpg 4 481 248 83 88 253 192 124 71 303405 134 79 151 302 82 54
![](http://img.blog.csdn.net/20160712134037926)
2.提取背景说明
运行程序,点击处理图片,提取背景,滑动鼠标选择框,如果选错的话,不会进行保存,当确认选对的话,再按下键盘的"B"或者"b",全部选好后,按"N"或者"n",就可以继续处理下一张,同时将上一张作为背景保存。
![](http://img.blog.csdn.net/20160712134114505)
本文程序下载链接:
http://download.csdn.net/detail/qq_14845119/9573851
实现了什么:
一个简单的抠图工具,可以实现对于前景的提取,主动保存为jpg图片,也可以实现将一幅图像中的前景全部置为黑色,生成背景图片。
为什么需要这个工具:
在图像处理、模式识别等研究领域,经常需要涉及到对图像库的训练工作。当然,有一些国外的公开的数据集可以供大家使用。目前主流的标注有2种,一种是基于区域的标注(ALFW、FDDB、CIFAR等,本文要实现的标注也是这种),另一种是基于像素的标注(COCO、LABLEME、MSRC)。但是大部分的时候,需要自己的样本库(图像标注员干的事),因此,一个可以快速进行抠图的工具便很有必要。
主要开发环境:
VS2010,opencv2.4.9,MFC,c++
主要程序讲解:
批量导入图像操作LoadImages(stringdirName,
vector<string> &imagesFullPath)
注意这里默认是导入当前目录下的所有jpg格式图片,如果需要别的格式的可以将下面程序的jpg改为bmp,png等所需要的格式。
_finddata_t fileDir; if (dirName[dirName.size() - 1] != '\\') dirName += "\\"; string fullPath = dirName + "*.jpg"; long lfDir; string imgName; cv::Mat image; if ((lfDir = _findfirst(fullPath.c_str(), &fileDir)) == -1l) { MessageBox(NULL,"No files founded.","No files founded.",MB_ICONQUESTION ); return; } else{ do{ imgName = dirName + string(fileDir.name); imagesFullPath.push_back(imgName); } while (_findnext(lfDir, &fileDir) == 0); } _findclose(lfDir);
鼠标点下的响应函数OnLButtonDown(UINTnFlags,CPointpoint) CKouTuBiDoc*
pDoc = GetDocument();
CKouTuBiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; pDoc->g_bDrawingBox = true; pDoc->g_rectangle =Rect( point.x, point.y, 0, 0 );
鼠标滑动的相应函数OnMouseMove(UINTnFlags,CPointpoint)
CKouTuBiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; if( pDoc->g_bDrawingBox ) { pDoc->g_rectangle.width = point.x-pDoc->g_rectangle.x; pDoc->g_rectangle.height = point.y-pDoc->g_rectangle.y; } InvalidateRect(NULL,FALSE);
鼠标弹起的响应函数OnLButtonUp(UINTnFlags,CPointpoint)
CKouTuBiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; pDoc->g_bDrawingBox = false; if( pDoc->g_rectangle.width < 0 ) { pDoc->g_rectangle.x += pDoc->g_rectangle.width; pDoc->g_rectangle.width *= -1; } if( pDoc->g_rectangle.height < 0 ) { pDoc->g_rectangle.y += pDoc->g_rectangle.height; pDoc->g_rectangle.height *= -1; } if (pDoc->thickness==-1) pDoc->color=cv::Scalar(0,0,0); else pDoc->color=cv::Scalar(pDoc->g_rng.uniform(0, 255), pDoc->g_rng.uniform(0,255), pDoc->g_rng.uniform(0,255)); pDoc->DrawRectangle( pDoc->SrcImg, pDoc->g_rectangle ,pDoc->color,pDoc->thickness);
画框函数OnDraw(CDC*pDC)
if( pDoc->g_bDrawingBox ) { pDoc->SrcImg.copyTo(pDoc->SrcImgCopy); if (pDoc->thickness==-1) pDoc->color=cv::Scalar(0,0,0); else pDoc->color=cv::Scalar(pDoc->g_rng.uniform(0, 255), pDoc->g_rng.uniform(0,255), pDoc->g_rng.uniform(0,255)); pDoc->DrawRectangle( pDoc->SrcImgCopy, pDoc->g_rectangle ,pDoc->color,pDoc->thickness); }
Info.txt说明
第一行为原始图片的存储路径,第二行为扣取图片的存储路径,第三行为程序正在读取的图片个数(初始化第一次抠图为0),第四行为当前保存的图片个数(初始化第一次抠图为1)。例如我的程序的info.txt路径如下(我的程序在C盘根目录存放,info.txt存放在当前工程目录)
C:\KouTuBi\KouTuBi\data\
C:\KouTuBi\KouTuBi\dst\
0
1
读取该配置文件的目的:
可以实现任意路径的图像的读取和存储,同时,对于大量图像的扣取,当中途中断的时候,下次打开还可以接着原来的继续扣取。
程序运行说明:
程序运行后整体软件效果图如下图所示
1.提取前景说明
运行程序,点击处理图片,提取前景,滑动鼠标选择框,如果选错的话,不会进行保存,当确认选对的话,再按下键盘的"Y"或者"y",就可以将图片保存在设置的目录下,并从1开始递增保存,同时生成ImageLists.txt文件(格式为图像路径扣取的目标个数 RECT坐标),例如我的ImageLists.txt文件如下。按"N"或者"n",就可以继续处理下一张。
C:\KouTuBi\KouTuBi\data\Chrysanthemum.jpg 0
C:\KouTuBi\KouTuBi\data\Desert.jpg 4 481 248 83 88 253 192 124 71 303405 134 79 151 302 82 54
2.提取背景说明
运行程序,点击处理图片,提取背景,滑动鼠标选择框,如果选错的话,不会进行保存,当确认选对的话,再按下键盘的"B"或者"b",全部选好后,按"N"或者"n",就可以继续处理下一张,同时将上一张作为背景保存。
本文程序下载链接:
http://download.csdn.net/detail/qq_14845119/9573851
相关文章推荐
- Linux修改文件时候,产生了一个.swap交换文件,如何删除
- deban8 linux 下 virtual box black arch linux 连不了网
- modprobe loop解决xen安装虚拟机时提示安装源错误的问题
- 在 Linux 下使用任务管理器
- Linux学习资料
- Nginx实现简易泛域名CDN节点
- Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
- eclipse中的server界面无法添加tomcat的解决办法
- Nginx泛解析的匹配域名绑定到子目录配置
- Linux 关机与重启
- popToViewController用法:
- Linux系统安装DNS步骤
- Linux 开发者如何看待 Git 和 Github?
- Linux 开发者如何看待 Git 和 Github?
- linux虚拟文件系统vfs
- 百度开放云首席架构师徐串:架构师对架构的理解 云 架构 架构师 百度
- 负载均衡 反向代理 nginx
- log4j.properties 配置的学习整理
- Android架构实例分析之编写hello驱动的系统硬件服务
- Weblogic修改控制台用户名和密码错误的解决方法