Golang : Changing a RGBA image number of channels with OpenCV
Problem:
Golang image packages deal with RGBA ( 4 channels ) and OpenCV deals with BGR ( 3 channels ).
You found out that the image frame returned by OpenCV's video capture from a camera only has 3 channels(BGR) - without the Alpha channel. You need to convert the image frame to BGRA ( 4 channels ).
Also, you would like to convert BGRA ( 4 channels ) to BGR (3 channels) as well. How to do that?
Solution:
First, create a new opencv.IplImage and with the number of channels that you want. If you want to convert the image to grayscale, set the number of channel to 1.
Next, use opencv.cvtColor()
to convert the image.
Just a note, you don't have to stick to the limited constants found in Go-OpenCV package.
const (
CV_BGR2GRAY = C.CV_BGR2GRAY
CV_RGB2GRAY = C.CV_RGB2GRAY
CV_GRAY2BGR = C.CV_GRAY2BGR
CV_GRAY2RGB = C.CV_GRAY2RGB
CV_BGR2BGRA = C.CV_BGR2BGRA
CV_RGBA2BGRA = C.CV_RGBA2BGRA
CV_BLUR_NO_SCALE = C.CV_BLUR_NO_SCALE
CV_BLUR = C.CV_BLUR
CV_GAUSSIAN = C.CV_GAUSSIAN
CV_MEDIAN = C.CV_MEDIAN
CV_BILATERAL = C.CV_BILATERAL
CV_8U = C.CV_8U
CV_8S = C.CV_8S
CV_16U = C.CV_16U
CV_16S = C.CV_16S
CV_32S = C.CV_32S
CV_32F = C.CV_32F
CV_64F = C.CV_64F
)
You can use the integer enumerations at [http://docs.opencv.org/3.1.0/df/d4e/group__imgproc__c.html][1]
in opencv.cvtColor()
function.
Here you go!
func opencvImageBGRToBGRA(img *opencv.IplImage) opencv.IplImage {
// The image frames from camera is in RGB (3 channels )
// We need to convert the frames to RGBA (4 channels )
// so that we can perform copy and paste the UTF8 strings
// into the region of interest.
// Using the ToImage() function will work, but will cause delay in refresh rate.
// Use CvtColor() function for the best result
w := img.Width()
h := img.Height()
// create an IplImage with 4 channels
tmp := opencv.CreateImage(w, h, opencv.IPL_DEPTH_8U, 4)
// upgrade BGR to BGRA ( 3 to 4 channels)
opencv.CvtColor(img, tmp, opencv.CV_BGR2BGRA)
return *tmp
}
func BGRAToBGR(img *opencv.IplImage) opencv.IplImage {
w := img.Width()
h := img.Height()
// create a IplImage with 3 channels
tmp := opencv.CreateImage(w, h, opencv.IPL_DEPTH_8U, 3)
// downgrade BGRA to BGR ( 4 to 3 channels)
opencv.CvtColor(img, tmp, 1)
// why use integer value of 1?
// see http://docs.opencv.org/3.1.0/df/d4e/group__imgproc__c.html
return *tmp
}
NOTES:
See request for RGB and RGB48 support in Golang discussion : https://groups.google.com/forum/#!topic/golang-nuts/z7W0nhBfCho
See also : Golang : Get RGBA values of each image pixel
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+4.8k Unix/Linux : Get reboot history or check when was the last reboot date
+9.8k Golang : Calculate Relative Strength Index(RSI) example
+19.8k Golang : For loop continue,break and range
+6.5k SSL : How to check if current certificate is sha1 or sha2 from command line
+11.4k Golang : Exit, terminating or aborting a program
+10.5k Golang : Sort and reverse sort a slice of runes
+5.7k Unix/Linux : How to fix CentOS yum duplicate glibc or device-mapper-libs dependency error?
+4.9k PHP : How to handle URI or URL with non-ASCII characters such as Chinese/Japanese/Korean(CJK) ?
+25.5k PHP : Convert(cast) string to bigInt
+18.3k Golang : Convert(cast) bytes.Buffer or bytes.NewBuffer type to io.Reader
+12.6k Golang : How to determine if a year is leap year?
+5.5k Nginx : Password protect a directory/folder