将 opencv mat 保存为不带分隔符的十六进制值到 txt 文件

saving an opencv mat to txt file as hex values without separators

我正在尝试将包含图像像素的 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;

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

有人能帮忙吗?

谢谢

如果您的图像是灰色的 ('one channel 8 bit depth')

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

else 将 "at" 函数的数据类型更改为 Vec3b if 3 channel

您不能使用 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;
}