Click here to Skip to main content
15,890,527 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
hi, i am involved with handwritten OCR application. I use MNIST digit database for training process here. I use following code for read pixels from the database and re-create the image. programs doesnt give any error but it gives meaningless image(totally black and blur pixel patters) as output. can someone explain the reason for that? plz help

here is my code

C++
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, 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);


        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));
                }			
            }
			size.height=r;size.width=c;
			create_image(size,3, &temp, i);
        }
    }
	return 0;
}
Posted
Updated 1-Jun-13 0:50am
v4

1 solution

You are reading the image pixel by pixel into temp and throwing temp away after each single read. Then you call create_image with just the last pixel read. That can't work.

You should instead create a buffer of size n_rows * n_cols and read an entire image into that buffer in a single read call.

How about the number of channels. Are these gray scale images? If yes, why did you specify 3 as number of channels?
 
Share this answer
 
Comments
David Jhones 3-Jun-13 4:49am    
hi nv3, thank you very much for consideration. yes this is the way, i develop piece of code based on your answer and it worked

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900