Y16 is a 16-bit grayscale format. The organization of the pixels in the image buffer is from left to right and top down.
Every pixel is stored as an little-endian unsigned 16-bit integer value.
Some sensors only support 10-bit or 12-bit pixel data. In this case, the least significant bits are don't-care values.
A video capture device, video format, FrameSnapSink, which defines the image data color format must have been setup. The following code fragments show step-by-step how to access and manipulate the pixel data of Y16.
First of all, we have to capture an image. Otherwise, the image buffer would be empty. To do so, we start live mode and call FrameHandlerSink::snapImages.
The following code retrieves a pointer to the image data. Please note, that getPtr() returns a BYTE pointer which will be type-casted to an uint16_t pointer. This makes it much easier to access the pixel data since Y16 is a 16-bit format.
// Y16 Images are stored top-down, so the upper left pixel starts at byte 0. // 2 Byte represent one pixel. uint16_t* pImgData = (uint16_t*)pActiveBuf->getPtr();
In this example, we want to output the first (upper left hand) pixel of the image and manipulate the first 3. As previously mentioned, the image data is stored top down. Therefore, pImgData points to the first pixel of the first line in the buffer.
// The Y16 pixel values exactly map unsigned 16-bit integers: uint16_t val0 = pImgData[0]; uint16_t val1 = pImgData[1]; printf( "\nImage buffer pixel format is eY16\n" ); printf( "Pixel 1 (Y16): %d\n", val0 ); printf( "Pixel 2 (Y16): %d\n", val1 );
Now we set the upper left three pixels to black, gray and white:
pImgData[0] = 0; // Set the first pixel to BLACK pImgData[1] = 32768; // Set the second pixel to GRAY pImgData[2] = 65535; // Set the third pixel to WHITE // We save the buffer as TIFF, so that other software can view it. saveToFileTIFF( *pActiveBuf, "Y16.tiff" );
To check the result, just open the saved image and examine the upper left pixels. They should look as follows: