Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

As Berak said, it's not a good idea to combine these images into a single 3 channel image. You make unnecessary memory operations and disk writing.

For vodeo files (avi or similar) there are no 16 bit codecs. You can save a series of 8 and 16 bit TIF files, but I think it's quite slow, so it won't work at 25+ fps.

The best way to do this (especially if the image size is known) would be to dump directly the data to the disk. Something like (c++ code):

ofstream myfile; myfile.open ("video.dat",ios::binary); uchar frame1=new uchar[wh]; ushort frame2=new ushort[wh]; Mat i1(w,h,frame1,CV_8UC1); Mat i2(w,h,frame2,CV_16UC1); .... myfile.write(frame1,wh); myfile.write(frame2,wh*2); ...//repeat for every frame myfile.close();

When reading the data, just do the opposite operations:

while(!myfile.eof()){
    myfile.read(frame1,w*h);
    myfile.read(frame2,w*h*2);
}

As Berak said, it's not a good idea to combine these images into a single 3 channel image. You make unnecessary memory operations and disk writing.

For vodeo files (avi or similar) there are no 16 bit codecs. You can save a series of 8 and 16 bit TIF files, but I think it's quite slow, so it won't work at 25+ fps.

The best way to do this (especially if the image size is known) would be to dump directly the data to the disk. Something like (c++ code):

code, only with two frames to keep things simple):

ofstream myfile;
 myfile.open ("video.dat",ios::binary);
 uchar frame1=new uchar[wh];
    *frame1=new uchar[w*h];
ushort frame2=new ushort[wh];
    *frame2=new ushort[w*h];
Mat i1(w,h,frame1,CV_8UC1);
 Mat i2(w,h,frame2,CV_16UC1);
 ....
    myfile.write(frame1,wh);
    myfile.write(frame2,wh*2);
    myfile.write(frame1,w*h);
myfile.write(frame2,w*h*2);
...//repeat for every frame
    myfile.close();

myfile.close();

When reading the data, just do the opposite operations:

while(!myfile.eof()){
    myfile.read(frame1,w*h);
    myfile.read(frame2,w*h*2);
}

By knowing the size of a data chunk (sizeof(frame1)+sizeof(frame2)+...), you can jump directly to a given frame, too.

If the image size can vary, you can write these parameters as the first bytes of the file.