2013-10-05 3 views
3

Привет, я могу написать объект Mat в текстовый файл. Как указано ниже,Как прочитать текстовый файл и создать объект Mat в C++

std::fstream outputFile; 
    outputFile.open("myFile.txt", std::ios::out) ; 

    outputFile << des_object.rows << std::endl; 
    outputFile << des_object.cols << std::endl; 

    for(int i=0; i<des_object.rows; i++) 
    { 
     for(int j=0; j<des_object.cols; j++) 
     { 
      outputFile << des_object.at<float>(i,j) << std::endl; 
     } 

    } 
    outputFile.close(); 

В моем коде в первых двух строках im печатается количество строк и количество столбцов, которое нужно использовать, когда я читаю его обратно. Но я не смог прочитать текстовый файл и снова создать объект Mat.

Следующий код, который я попробовал. Не уверен, правильный ли код.

Mat des_object1; 
    std::ifstream file("myFile.txt"); 
    std::string str; 
    int rows; 
    int cols; 
    int a = 0; 
    while (std::getline(file, str)) 
    { 
     int i = 0; 
     int j = 0; 

     if(a == 0){ 
      rows = std::stoi(str); 
     }else if(a == 1){ 
      cols = std::stoi(str); 
     }else{ 

      for(i; i< rows; i++) 
      { 
       for(j; j<cols; j++) 
       { 
        des_object1.at<float>(i,j) = ::atof(str.c_str()); 
        break; 
       } 
      } 

     } 
     ++a; 
    } 

ответ

9

это, вероятно, гораздо проще, использовать OpenCV FileStorage:

// write: 
Mat m; 
FileStorage fs("myfile.txt",FileStorage::WRITE); 
fs << "mat1" << m; 

// read: 
FileStorage fs("myfile.txt",FileStorage::READ); 
fs["mat1"] >> m; 
+1

Эта работа, когда я пишу мат в файл. Но когда я прочитал, он дал мне пустой – posha

+1

@berak, ссылка, которую вы указали, упоминает, что FileStorage работает для файлов xml/yaml, ничего не упоминается о файлах .txt. Я пробовал читать файл .txt, но это дало мне ошибку: Ошибка Parsing: Valid xml должен начинаться с ''> в icvXMLParse ................. – Ruchir

0

Вы получили свои внутренние петли в неправильном месте: Вы должны были бы держать счетчик вокруг каждой итерации чтения строки , Это можно сделать намного проще, хотя:

if (in >> rows >> cols) { 
    // resize the matrix to its proper size 
    for (int r(0); r!= rows; ++r) { 
     for (int c(0); c != cols; ++c) { 
      if (!(in >> mat[r][c])) { 
       throw std:: runtime_error("failed to read matrix"); 
      } 
     } 
    } 
} 
0

попробовать что-то вроде этого:

инициализировать эти два вне while цикла

int k=0; 
int l=0; 

и вместо использования for петли

if(j<cols){ 
    des_object1.at<float>(k,l) = ::atof(str.c_str()); 
}else{ 
    k=0; 
    l++; 
    des_object1.at<float>(k,l) = ::atof(str.c_str()); 
} 
j++; 
Смежные вопросы