從完全不包含人體的圖片中隨機剪裁出64*128大小的用於人體檢測的負樣本

masikkk發表於2013-11-13

進行行人檢測的分類器訓練時,負樣本是從完全不包含人體的圖片中隨機剪裁出來的,下面程式的目的就是這個:


#include <iostream>
#include <fstream>
#include <stdlib.h> //srand()和rand()函式
#include <time.h> //time()函式
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>

using namespace std;
using namespace cv;

int CropImageCount = 0; //裁剪出來的負樣本圖片個數

int main()
{
	Mat src;
	string ImgName;
	char saveName[256];//裁剪出來的負樣本圖片檔名
	ifstream fin("INRIANegativeImageList.txt");//開啟原始負樣本圖片檔案列表
	//ifstream fin("subset.txt");

	//一行一行讀取檔案列表
	while(getline(fin,ImgName))
	{
		cout<<"處理:"<<ImgName<<endl;
		ImgName = "D:\\DataSet\\INRIAPerson\\INRIAPerson\\Train\\neg\\" + ImgName;
		src = imread(ImgName);//讀取圖片
		//cout<<"寬:"<<src.cols<<",高:"<<src.rows<<endl;

		//圖片大小應該能能至少包含一個64*128的視窗
		if(src.cols >= 64 && src.rows >= 128)
		{
			srand(time(NULL));//設定隨機數種子

			//從每張圖片中隨機裁剪10個64*128大小的不包含人的負樣本
			for(int i=0; i<10; i++)
			{
				int x = ( rand() % (src.cols-64) ); //左上角x座標
				int y = ( rand() % (src.rows-128) ); //左上角y座標
				//cout<<x<<","<<y<<endl;
				Mat imgROI = src(Rect(x,y,64,128)); 
				sprintf(saveName,"noperson%06d.jpg",++CropImageCount);//生成裁剪出的負樣本圖片的檔名
				imwrite(saveName, imgROI);//儲存檔案
			}
		}
	}

	system("pause");
}


原始碼下載,環境為VS2010 + OpenCV2.4.4

http://download.csdn.net/detail/masikkk/6547869
參考

從完全不包含人體的圖片中隨機剪裁出用於人體檢測的負樣本


相關文章