模式识别

处理特征数据 及 代码


本文地址: http://blog.csdn.net/caroline_wendy/article/details/26240241


输入文件: 

1. 归一化后的特征文件, 第1列是标签, 其余列是特征;

2. 特征最大值向量文件: 前3列是标准格式, 其余列是最大值;

输出文件:

1. 符合SVM训练数据的特征格式;

2. Mat存储的标准XML文件;


代码:

/*
处理特征数据程序
By C.L.Wang
数据格式:
特征数据: 第1列是标签, 其余列是特征;
最大值数据: 前3列是标准格式, 其余列是最大值;
转换为: SVM通用格式, 训练SVM的model; 转换为OpenCV矩阵的存储Mat;
*/

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

#include <opencv.hpp>

/*转换SVM数据格式*/

void transformSvmData (
	const std::string _inputFileName, /*输入数据文件*/
	const std::string _outputFileName, /*输出数据文件*/
	const int _rows, /*行数, 自设*/
	const int _cols /*列数, 自设*/
)
{
	//const int rows (800); //行数, 自设
	//const int cols (104); //列数, 自设
	cv::Mat trainData = cv::Mat(_rows, _cols, CV_64FC1);

	/*读取文件*/

	std::ifstream file_data(_inputFileName);
	if (file_data.fail()) {
		std::cerr << "Failed to open the file!" << std::endl;
		return;
	}
	for (int i=0; i<_rows; ++i) {
		for (int j=0; j<_cols; ++j) {
			file_data >> trainData.at<double>(i,j);
		}
	}
	file_data.close();

	/*转换SVM格式*/

	std::ofstream svmData(_outputFileName);
	for (int i=0; i<_rows; i++)
	{
		svmData << trainData.at<double>(i, 0) << " ";

		for (int j=1; j<_cols-1; j++) { //少1行
			svmData << j << ":" << trainData.at<double>(i, j) << " ";
		}

		svmData << _cols-1 << ":" << 
			trainData.at<double>(i,_cols-1) << std::endl; //最后一行不加空格
	}
	svmData.close();

	return;
}

/*转换归一化向量*/

void transformNormXML (
	const std::string _maxFileName,
	const int _cols /*列数, 自设*/
	)
{
	const int rows = 1;
	//const int cols = 104; //列数, 自设

	/*读取文件*/

	cv::Mat normMat = cv::Mat(rows, _cols, CV_64FC1);
	std::ifstream maxData(_maxFileName, std::ifstream::in);
	if (maxData.fail()) {
		std::cerr << "Failed to open the file!" << std::endl;
		return;
	}
	for (int i=0; i<rows; ++i) {
		for(int j=0; j<_cols; ++j){
			maxData >> normMat.at<double>(i,j);
		}
	}
	maxData.close();

	/*写入XML*/

	cv::FileStorage fileXml("normalization.xml", cv::FileStorage::WRITE);
	fileXml << "normalization" << normMat; //标签
	fileXml.release();

	return;
}

int main() 
{
	const std::string input_file_name = "violence_norm_matlab.txt"; /*输入数据文件*/
	const std::string output_file_name = "violence_norm_svm.txt"; /*输出数据文件*/
	const int rows = 843; /*输入文件行数, 自设*/
	const int cols = 102; /*输入文件列数, 自设*/
	transformSvmData(input_file_name, output_file_name, rows, cols);

	const std::string max_file_name = "violence_max_matlab.txt";
	transformNormXML(max_file_name, cols+2); //和曾经标准统一

	std::cout << "Program Over! " << std::endl;

	return 0;
}




原文地址:https://www.cnblogs.com/hrhguanli/p/5096337.html