将opencv mat保存为txt文件为十六进制值而不使用分隔符

时间:2017-02-06 13:00:21

标签: c++ opencv hex writefile file-storage

我正在尝试将包含图像像素的OpenCV垫保存到txt文件(之后将导入到VHDL测试平台以进行进一步处理)。

我需要文件只包含没有任何其他信息的像素值,我需要它是十六进制的。也没有任何分隔符,如逗号,分号等。

到目前为止,我想出的是:

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;

输出文本文件包含我不需要的所有内容。 我尝试了所有组合以编写十六进制值,但失败了......

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:0)

如果您的图像为灰色(&#39;一个通道为8位深度&#39;)

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

否则更改&#34; at&#34;的数据类型如果是3个频道,则功能为Vec3b

答案 1 :(得分: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;
}