基于MFC和OpenCV的图像标注工具

深度学习时代,对于任何任务,性能提升最大的,不是算法,而是对数据的合理处理。


实现了什么:

         一个简单的抠图工具,可以实现对于前景的提取,主动保存为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

读取该配置文件的目的:

可以实现任意路径的图像的读取和存储,同时,对于大量图像的扣取,当中途中断的时候,下次打开还可以接着原来的继续扣取。

程序运行说明:

程序运行后整体软件效果图如下图所示

基于MFC和OpenCV的图像标注工具_第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

基于MFC和OpenCV的图像标注工具_第2张图片

2.提取背景说明

         运行程序,点击处理图片,提取背景,滑动鼠标选择框,如果选错的话,不会进行保存,当确认选对的话,再按下键盘的"B"或者"b",全部选好后,按"N"或者"n",就可以继续处理下一张,同时将上一张作为背景保存。

基于MFC和OpenCV的图像标注工具_第3张图片

本文程序下载链接:

http://download.csdn.net/detail/qq_14845119/9573851



你可能感兴趣的:(机器学习)