0

申し訳ありませんが、これは多少重複する可能性がありますが、修正できません。私は手書きのOCRアプリケーションに携わっています。ここでは、トレーニング プロセスに MNIST 数字データベースを使用します。ここでは、データベースからピクセルを読み取り、画像を再作成するために次のコードを使用します。プログラムはエラーを出しませんが、無意味な画像 (完全に黒く不鮮明なピクセル パターン) を出力します。誰かがその理由を説明できますか?助けてください

ここに私のコードがあります

int reverseInt(int i) {
unsigned char c1, c2, c3, c4;
c1 = i & 255;
c2 = (i >> 8) & 255;
c3 = (i >> 16) & 255;
c4 = (i >> 24) & 255;
return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}

void create_image(CvSize size, int channels, unsigned char* data[28][28], int imagenumber) {
string imgname; ostringstream imgstrm;string fullpath;
imgstrm << imagenumber;
imgname=imgstrm.str();
fullpath="D:\\"+imgname+".jpg";

IplImage *imghead=cvCreateImageHeader(size, IPL_DEPTH_16S, channels);
imghead->imageData=(char *)data;
cvSaveImage(fullpath.c_str(),imghead);  
}
int main(){
ifstream file ("D:\\train-images.idx3-ubyte",ios::binary);
if (file.is_open())
{
    int magic_number=0; int number_of_images=0;int r; int c;
    int n_rows=0; int n_cols=0;CvSize size;unsigned char temp=0;

    file.read((char*)&magic_number,sizeof(magic_number)); 
    magic_number= reverseInt(magic_number);

    file.read((char*)&number_of_images,sizeof(number_of_images));
    number_of_images= reverseInt(number_of_images);

    file.read((char*)&n_rows,sizeof(n_rows));
    n_rows= reverseInt(n_rows);
    file.read((char*)&n_cols,sizeof(n_cols));
    n_cols= reverseInt(n_cols);
    unsigned char *arr[28][28];


    for(int i=0;i<number_of_images;++i)
    {
        for(r=0;r<n_rows;++r)
        {
            for(c=0;c<n_cols;++c)
            {                 
                file.read((char*)&temp,sizeof(temp));
                arr[r][c]= &temp;
            }           
        }
        size.height=r;size.width=c;
        create_image(size,1, arr, i);
    }
}
return 0;
}
4

2 に答える 2

1

また、OpenCV で MNIST を使用したかったのですが、この質問は私が得た最も近いものでした。

cv::Matの代わりに「コピー&ペースト->幸せになる」バージョンを投稿すると思いましたiplimage。これは作業が簡単だからです。また、 OpenCV 2.x以降では cv::Mat が推奨されます。cv::Matこのメソッドは、画像とラベルのペアのベクトルをints として取得します。楽しむ。

std::vector<std::pair<cv::Mat,int>> loadBinary(const std::string &datapath, const std::string &labelpath){
    std::vector<std::pair<cv::Mat,int>> dataset;
    std::ifstream datas(datapath,std::ios::binary);
    std::ifstream labels(labelpath,std::ios::binary);

    if (!datas.is_open() || !labels.is_open())
        throw std::runtime_error("binary files could not be loaded");

    int magic_number=0; int number_of_images=0;int r; int c;
    int n_rows=0; int n_cols=0; unsigned char temp=0;

    // parse data header
    datas.read((char*)&magic_number,sizeof(magic_number));
    magic_number=reverseInt(magic_number);
    datas.read((char*)&number_of_images,sizeof(number_of_images));
    number_of_images=reverseInt(number_of_images);
    datas.read((char*)&n_rows,sizeof(n_rows));
    n_rows=reverseInt(n_rows);
    datas.read((char*)&n_cols,sizeof(n_cols));
    n_cols=reverseInt(n_cols);

    // parse label header - ignore
    int dummy;
    labels.read((char*)&dummy,sizeof(dummy));
    labels.read((char*)&dummy,sizeof(dummy));

    for(int i=0;i<number_of_images;++i){
        cv::Mat img(n_rows,n_cols,CV_32FC1);

        for(r=0;r<n_rows;++r){
            for(c=0;c<n_cols;++c){
                datas.read((char*)&temp,sizeof(temp));
                img.at<float>(r,c) = 1.0-((float)temp)/255.0; // inverse 0.255 values
            }
        }
        labels.read((char*)&temp,sizeof(temp));
        dataset.push_back(std::make_pair(img,(int)temp));
    }
    return dataset;
}

上記と同じ:

int reverseInt(int i) {
    unsigned char c1, c2, c3, c4;
    c1 = i & 255; c2 = (i >> 8) & 255; c3 = (i >> 16) & 255; c4 = (i >> 24) & 255;
    return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}
于 2014-01-15T14:07:36.110 に答える