2013-05-01 47 views
20

Tôi có một ma trậnLàm thế nào để viết một Mat phao vào một tập tin trong OpenCV

Mat B(480,640,CV_32FC1);

chứa values..I nổi muốn viết ma trận này vào một tập tin có thể được mở bằng notepad hoặc MS Word hoặc Excel để xem các giá trị bên trong và để lưu trữ .... imwrite function chỉ có thể lưu hình ảnh 8 bit hoặc 16 bit.

Thả đề xuất của bạn nếu việc này có thể được thực hiện? nếu có, làm thế nào ??

+0

bạn có thể [viết ma trận trong tệp xml hoặc yaml] [1]. [1]: http://stackoverflow.com/questions/15115046/how-should-a-typical-yml-or-xml-matrix-look-for-opencv-use/15131776#15131776 – Saikat

Trả lời

32

Sử dụng OpenCV tinh khiết cuộc gọi API:

// Declare what you need 
cv::FileStorage file("some_name.ext", cv::FileStorage::WRITE); 
cv::Mat someMatrixOfAnyType; 

// Write to file! 
file << someMatrixOfAnyType; 

Phần mở rộng tập tin có thể được xml hoặc yml. Trong cả hai trường hợp, bạn nhận được một tiêu đề nhỏ mà bạn có thể dễ dàng xóa/phân tích cú pháp, sau đó bạn có quyền truy cập vào dữ liệu ở định dạng dấu chấm động. tôi đã sử dụng phương pháp này thành công (với các tập tin yml) để có được dữ liệu vào Matlab và Matplotlib

Để có được dữ liệu:

  1. mở tập tin với bất kỳ trình soạn
  2. sau đó ngăn chặn tất cả các văn bản và số trừ nội dung của thẻ dữ liệu (ví dụ: giá trị pixel).
  3. Khi hoàn tất, lưu tệp của bạn bằng tiện ích mở rộng txt hoặc csv và mở tệp bằng MATLAB (tác vụ kéo và thả).

Voilà. Bạn có thể phải định hình lại ma trận kết quả trong dòng lệnh MATLAB nếu nó không đoán đúng kích thước hình ảnh.

+0

Cảm ơn bạn ... Tôi có thể mở tệp bằng gedit .. Bạn có thể cho tôi biết cách tải tệp xml này trong Matlab hoặc Excel không? .. –

+0

Tôi đã chỉnh sửa câu trả lời. – sansuiso

+17

Tôi nghĩ bạn cần đặt tên cho ma trận, như 'file <<" matName "<< someMatrixOfAnyType'; nếu không tôi nhận được lỗi này: 'Lỗi OpenCV: Lỗi không xác định (Không có tên phần tử đã được đưa ra) trong toán tử <<, tệp /usr/local/include/opencv2/core/operations.hpp, dòng 2910' –

14

Bạn có thể viết cv::Mat vào tệp văn bản bằng cách xử lý tệp C++ đơn giản.

Đây là cách bạn có thể làm điều đó:

#include <iostream> 
#include <fstream> 

using namespace std; 

void writeMatToFile(cv::Mat& m, const char* filename) 
{ 
    ofstream fout(filename); 

    if(!fout) 
    { 
     cout<<"File Not Opened"<<endl; return; 
    } 

    for(int i=0; i<m.rows; i++) 
    { 
     for(int j=0; j<m.cols; j++) 
     { 
      fout<<m.at<float>(i,j)<<"\t"; 
     } 
     fout<<endl; 
    } 

    fout.close(); 
} 

int main() 
{ 
    cv::Mat m = cv::Mat::eye(5,5,CV_32FC1); 

    const char* filename = "output.txt"; 

    writeMatToFile(m,filename); 

} 
+1

Muốn chấp nhận câu trả lời này quá ... Nhưng chỉ 1 có thể được đưa ra ... dù sao cách tiếp cận đơn giản này cũng hoạt động tuyệt vời! 1 –

+0

Cách tiếp cận của bạn có hiệu quả về thời gian như câu trả lời được chấp nhận không? – smttsp

+0

@smttsp Tôi không nghĩ vậy. Triển khai OpenCV có thể được tối ưu hóa. – sgarizvi

0

sử dụng ghi nhị phân:

FILE* FP = fopen("D.bin","wb"); 
    int sizeImg[2] = { D.cols , D.rows }; 
    fwrite(sizeImg, 2, sizeof(int), FP); 
    fwrite(D.data, D.cols * D.rows, sizeof(float), FP); 
    fclose(FP); 

sau đó bạn có thể đọc ở trong matlab kích thước đọc và sau đó định hình lại (type = đơn)

fp=fopen(fname); 
data=fread(fp,2,'int'); 
width = data(1); height = data(2); 
B = fread(fp,Inf,type); 

imageOut = reshape(B,[width,height])'; 

fclose(fp); 
Các vấn đề liên quan