2017-02-06 13 views
1

Я пытаюсь сохранить макет OpenCV, содержащий пиксели изображения, в txt-файл (который затем будет импортирован в тестовую среду VHDL для дальнейшей обработки).Сохранение opencv mat в txt файл как шестнадцатеричные значения без разделителей

Мне нужно, чтобы файл содержал только значения пикселей без какой-либо другой информации, и мне нужно, чтобы он был в шестнадцатеричном формате. Кроме того, без каких-либо разделителей, такие как запятые, точки с запятой, и т.д ..

что я придумал до сих пор является: текстовый файл

cv::Mat srcImage; 
srcImage = imread("image.jpg", 1); 
if (srcImage.empty()) 
{ 
    cout << "ERROR : Image cannot be loaded..!!" << endl; 
    return -1; 
} 

cv::FileStorage file("data.txt", cv::FileStorage::WRITE); file <<"srcImage"<<srcImage;

Выход содержит все вещи, которые я дон Не нужно. Я пробовал все комбинации, чтобы записать шестнадцатеричные значения, но не удалось ...

Может кто-нибудь помочь, пожалуйста?

Благодаря

+0

Пожалуйста, дайте мне знать, если он работает, как ожидалось – Miki

ответ

0

Вы не можете сделать это, используя cv::FileStorage. Вы можете просто сохранить данные, как вам нужно файл с помощью std::ofstream:

#include <opencv2\opencv.hpp> 
#include <iostream> 
#include <iomanip> 
using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat3b img(3, 4, Vec3b(15,14,12)); 
    randu(img, Scalar(0, 0, 0), Scalar(256, 256, 256)); 

    // Save to Hex ASCII 
    ofstream out("data.txt"); 
    for (int r = 0; r < img.rows; ++r) { 
     for (int c = 0; c < img.cols; ++c) { 
      const Vec3b& v = img(r, c); 
      out << hex << uppercase << setw(2) << setfill('0') << int(v[0]); 
      out << hex << uppercase << setw(2) << setfill('0') << int(v[1]); 
      out << hex << uppercase << setw(2) << setfill('0') << int(v[2]); 
     } 
    } 

    return 0; 
} 
+0

Спасибо @Miki, я предполагаю, что буду использовать ваше предложение, вместо того чтобы работать с FileStorage. –

0

В случае, если изображение является серым цветом («один канал 8 битой глубиной»)

for (int y=0; y< srcImage.rows; ++y) { 
    for (int x=0; x < srcImage.cols; ++x) { 
     file << srcImage .at<uchar>(y,x);}} 

еще изменить тип данных для «в» функциях Vec3b, если 3 канал

+0

@ M.Sebaa спасибо за ответ, изображение 24bit RGB, но я нужен вывод должен быть в шестнадцатеричном значении, а не uchar, есть ли у вас какие-либо идеи, как это сделать? –

+0

файл << std :: hex << (int) srcImage .at (y, x); –

+0

как в http://stackoverflow.com/questions/10723403/char-array-to-hex-string-c –