如何在源代码本身中嵌入要读取的图像,而不是使用imread()来读取文件?例如,GIMP可以选择将图像导出为C源文件或头文件。我该如何利用它?
答案 0 :(得分:1)
图像只是一个数字数组。 OpenCV的Mat
构造函数可以接受指向数据的指针:
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
如果您的图像数据是硬编码数组,则可以使用它来初始化cv::Mat
对象
答案 1 :(得分:0)
您可以使用此代码段:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// uncomment for test
//#include "image.h"
int main(int argc, char **argv)
{
Mat img=imread("D:\\ImagesForTest\\lena.jpg");
int w=img.cols;
int h=img.rows;
int channels=img.channels();
ofstream os("image.h");
os << "int rows=" << h << ";" << endl;
os << "int cols=" << w << ";" << endl;
os << "unsigned char d[]={" << endl;
for(int i=0;i<h;++i)
{
for(int j=0;j<w;++j)
{
if(i!=(w-1) || j!=(h-1))
{
Vec3b b=img.at<Vec3b>(i,j);
os << format("0x%02x,",b[0]);
os << format("0x%02x,",b[1]);
os << format("0x%02x,",b[2]);
}
}
}
Vec3b b=img.at<Vec3b>(w-1,h-1);
os << format("0x%02x,",b[0]);
os << format("0x%02x,",b[1]);
os << format("0x%02x",b[2]);
os << endl << "};" << endl;
os << "Mat I=Mat(rows,cols,CV_8UC3,d);" << endl;
os.close();
// uncomment for test
/*
namedWindow("I");
imshow("I",I);
waitKey();
return 0;
*/
}
它创建包含图像I的头文件image.h。
假设图像是具有uchar元素类型的彩色3通道图像。