扩充数据集升级版 --> 提取目标

俺上个程序说的是在深度学习的趋势下扩充数据集的问题,并附了代码和demo,这次的博客就是上个代码的升级版,提取目标的数据扩充

 

话不多说,直接上代码和demo

 

代码如下:

 

#include <cv.h>   
#include <cxcore.h>   
#include <highgui.h>   
#include <vector>
#include "highgui.hpp"
#include <iostream>
#include <fstream>  
#include <string>
#include <io.h>  
#include "stdlib.h"  
#include <cstdlib>  
#include <typeinfo> 

using namespace cv;
using namespace std;

char* hand_path = "C:\\Users\\Administrator\\Desktop\\fore_hand";
char* background_path = "C:\\Users\\Administrator\\Desktop\\back_hand";

void getFiles(string path, vector<string>& files)
{
	long hFile = 0;
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*.png").c_str(), &fileinfo)) != -1)
	{
		do
		{
			files.push_back(p.assign(path).append("\\").append(fileinfo.name));

		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

int count_img = 0;

int main()
{
	vector<string> hand_file;
	vector<string> background_file;

	getFiles(hand_path, hand_file);
	getFiles(background_path, background_file);

	int size_hand_file = hand_file.size();
	int size_background_file = background_file.size();

	for (int i = 0; i < size_hand_file; i++)
	{
		for (int j = 0; j < size_background_file; j++)
		{
			Mat origin_hand = imread(hand_file[i]);
			IplImage* img;
			img = &IplImage(origin_hand);
			IplImage* bin = cvCreateImage(cvGetSize(img), 8, 1);

			cvCvtColor(img, bin, CV_BGR2GRAY);  //灰度
			cvSmooth(bin, bin, CV_MEDIAN, 3, 3, 0); //平滑
			cvCanny(bin, bin, 255, 255, 3); //边缘
			cvThreshold(bin, bin, 200, 255, CV_THRESH_BINARY); //二值化

			int bin_width = bin->width;
			int bin_height = bin->height;

			for (int k = 0; k < bin_height; k++)
			{
				int col = bin_width - 2;
				((uchar *)(bin->imageData + k*bin->widthStep))[col] = 255;
			}

			CvSeq *pContour = NULL;
			CvMemStorage *pStorage = NULL;

			pStorage = cvCreateMemStorage(0);
			cvFindContours(bin, pStorage, &pContour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); //轮廓

			cvDrawContours(bin, pContour, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 1, CV_FILLED, 8, cvPoint(0, 0)); //画

			cvReleaseMemStorage(&pStorage);
			pStorage = NULL;

			cvErode(bin, bin, NULL, 1); //腐蚀

			IplImage* desc;
			CvSize sz;
			sz.height = 200;
			sz.width = bin->width * 200 / bin->height;
			desc = cvCreateImage(sz, bin->depth, bin->nChannels);
			cvResize(bin, desc, CV_INTER_CUBIC);

			Mat img_mat(img, 1);
			Mat size_img;
			Size size;
			size.height = 200;
			size.width = img_mat.cols * 200 / img_mat.rows;
			resize(img_mat, size_img, size);

			Mat background = imread(background_file[j]);
			Mat size_background;
			Size size_back;
			size_back.height = 500;
			size_back.width = background.cols * 500 / background.rows;
			resize(background, size_background, size_back);

			复制img

			for (int row = 0; row < desc->height; row++)
			{
				for (int col = 0; col < desc->width; col++)
				{
					if (((uchar *)(desc->imageData + row*desc->widthStep))[col] == 255)
					{
						int move_row = row + 150;
						int move_col = col + 150;
						size_background.at<Vec3b>(move_row, move_col)[0] = size_img.at<Vec3b>(row, col)[0];
						size_background.at<Vec3b>(move_row, move_col)[1] = size_img.at<Vec3b>(row, col)[1];
						size_background.at<Vec3b>(move_row, move_col)[2] = size_img.at<Vec3b>(row, col)[2];
					}
				}
			}

			存储img

			char save_img[100];
			IplImage *src;
			src = &IplImage(size_background);
			sprintf(save_img, "C:\\Users\\Administrator\\Desktop\\result\\hand_%d.png", count_img);
			cvSaveImage(save_img, src);

			printf("save_img: %d ---> DONE!\n",count_img);
			
			存储xml///

			int min_x = 150;
			int min_y = 150;
			int max_x = 150 + size_img.cols;
			int max_y = 150 + size_img.rows;
			int array[] = { min_x, min_y, max_x, max_y };

			char save_xml[100];
			sprintf(save_xml, "C:\\Users\\Administrator\\Desktop\\xml\\hand_%d.txt", count_img);

			ofstream outfile;
			outfile.open(save_xml, 'w');
			outfile << "hand_" <<count_img<<".txt"<< " " << 1 << " " << "[" << endl;
			for (int k = 0; k < 4; k++)
			{
				if (k < 3)
				{
					outfile << array[k] << "," << ' ' << endl;
				}
				else
				{
					outfile << array[k] << "]" << endl;
				}
			}
			outfile.close();

			printf("save_xml: %d ---> DONE!\n", count_img);

			count_img++;

		}
	}
	system("pause");
	return 0;
}

demo如下:

 


  +  = 

 

 

任何问题请加唯一QQ2258205918(名称samylee)!

唯一VX:samylee_csdn

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值