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
+12.5k Swift : Convert (cast) Int or int32 value to CGFloat
+9.1k Golang : Timeout example
+12.4k Golang : Add ASCII art to command line application launching process
+5.2k Golang *File points to a file or directory ?
+18.2k Golang : Logging with logrus
+14.7k Golang : package is not in GOROOT during compilation
+5.4k Javascript : How to refresh page with JQuery ?
+5.3k Clean up Visual Studio For Mac installation failed disk full problem
+5.8k Fontello : How to load and use fonts?
+10.3k Golang : How to unmarshal JSON inner/nested value and assign to specific struct?
+5.1k PHP : Hide PHP version information from curl
+8.8k Golang : Handle sub domain with Gin