模式识别 - 处理特征数据 及 代码
处理特征数据 及 代码
本文地址: 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; }