<< Chapter < Page | Chapter >> Page > |
The pixels received as input from the camera are in the YUV420sp format, which signifies how the data is packed into a linear array. The Wikipedia article on YUV , especially the section titled "Y'UV420p (and Y'V12 or YV12) to RGB888 conversion" , may be a useful reference; make sure that you thoroughly understand the structure of a single frame of data.
Open
jni_part.cpp
and complete the
YUV2RGB()
function. You will be able to see your results by selecting "Preview RGB" from the options menu.
To learn how to access individual pixel values, read the OpenCV documentation on basic operations with images . It is also important to know that you are working with images that use 8-bit unsigned pixel values.
To assist you in writing the conversion code, you may reference the YUV to RGB conversion code provided on Wikipedia. Remember, you will need to access the pixel values using the proper matrix syntax. See the OpenCV matrix documentation .
After you verify you are streaming color images, continue on to the next part to implement histogram equalization.
In
jni_part.cpp
in the
HistEQ()
function, notice that the lines
Mat* pYUV=(Mat*)addrYuv;
Mat* pRGB=(Mat*)addrRgba;
set up pointers to the video input and output. One frame of video lies in the matrix pointed to by
pYUV
. Your assignment is to modify this matrix of pixels so that the left half of the image is histogram equalized, and the right half of the image remains unprocessed. Then you will need to convert the YUV format image to RGB format and save it in the matrix pointed to by
pRGB
. This HistEQ C function is called every time a new video frame is ready to be processed, allowing an entire video stream to be processed over time.
The algorithm can be broken up into 4 steps:
Unless you are already familiar with histogram equalization, reading the OpenCV histogram equalization tutorial should be helpful in understanding how this algorithm affects an image. OpenCV is an open source computer vision library that provides many useful functions for Android developers to use when creating applications that rely on image and video processing. You will use some of OpenCV's functionality in this lab.
Once you have received data in from the camera in YUV format, you will need to create a histogram of the values of the Y channel in that frame.
Next, you must compute the cumulative distribution function (CDF) of your histogram. The CDF will be used in the next step to equalize the histogram.
Take each Y channel value as an index into the CDF to obtain the equalized Y channel value. Read the OpenCV histogram equalization tutorial for more information on using the CDF as a remapping function.
While the pixels coming in from the camera are in YUV format, the pixels going out to the tablet's display are in RGB format. You will need to convert your half-equalized YUV image into RGB format, and store the image in the matrix pointed to by
pRGB
.
When the application is launched on the Nexus 7, you must tap the
...
near the bottom right of the screen, and select "Hist EQ". When working correctly, the right half of the video should display the unprocessed input, and the left half of the video should display the equalized video.
Histogram equalization is one special case of tone mapping , which simulates higher dynamic range and results in more dramatic images. This section is completely optional, but if you are interested, explore and see what sort of "Instagram"-like effects you can achieve!
Notification Switch
Would you like to follow the 'Ece 420 fall 2013' conversation and receive update notifications?