I have a series of 128x128 pixel sized frames stored in a binary file. Each pixel has 32 bits of information, I am interested in the last 12 bits of each pixel, these 12 bits should provide me with a grayscale image.
I know openCV doesn't support 12-bit, so I tried to do the masking using 0xfff, not sure if that is right. In my attempt I am looking at the 99th frame of the video, there is a 1024 byte header in each file that I am skipping, and each frame has 66960 bytes, hence the 66960*99 to skip to the 99th frame. I also skip a reserved 4 bytes which is in each.
The resulting image I get looks almost right, except it seems like there is a gray mask over the whole image. I have both what I am getting and what it should look like at the bottom attached.
My attempt is below, I know I am getting the pixel information right because I am checking pixel values by using another software, I believe the problem is in the way I am using the data types and Mat image type (unsigned int, short etc and CV_16U, CV_16S, CV_32). Please help with how to pad the pixel data and/or what type Mat to use. Thanks.
file = fopen("binary_file", "rb");
fseek(file, 0, SEEK_END);
//frame loop
unsigned int buffer[65536];
fseek(file,4+1024+66960*99, SEEK_SET);
fread(buffer, 4, 65536, ff);
Mat img(128,128,CV_16S);
int p = 0;
for (int y = 0; y < img.rows; y++) {
for (int x = 0; x < img.cols; x++) {
img.at<short>(y, x) = ((buffer[p] & ((1 << 12) - 1)) & 0xfff);
p++;
}
}
imgshow("img",img);