从源代码嵌入和读取图像

时间:2014-01-06 06:09:56

标签: c++ opencv

如何在源代码本身中嵌入要读取的图像,而不是使用imread()来读取文件?例如,GIMP可以选择将图像导出为C源文件或头文件。我该如何利用它?

2 个答案:

答案 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通道图像。