深度学习时代,对于任何任务,性能提升最大的,不是算法,而是对数据的合理处理。
实现了什么:
一个简单的抠图工具,可以实现对于前景的提取,主动保存为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