我正在尝试将包含图像像素的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;
输出文本文件包含我不需要的所有内容。 我尝试了所有组合以编写十六进制值,但失败了......
有人可以帮忙吗?
由于
答案 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;
}