Golang : Add text to image and get OpenCV's X, Y co-ordinates example
Building on from the previous OpenCV-GTK-GUI application tutorial. For this tutorial, I need to know where to position my text on the camera feed. To be precise, I need to know the X and Y coordinates returned by Go-OpenCV's Point struct for top-left, top-right, bottom-left and bottom-right locations. Also, I need to be able to control the text position with two sliders(scrollbars or trackbars).
The code example that follows will write a simple "Hello World" string and the current time on screen (camera feed) and allow us to control the text's position.
Here you go!
package main
import (
"fmt"
"strconv"
"time"
"github.com/lazywei/go-opencv/opencv"
"github.com/mattn/go-gtk/glib"
"github.com/mattn/go-gtk/gtk"
)
var (
win = new(opencv.Window)
webCamera = new(opencv.Capture)
statusbar = new(gtk.Statusbar)
snapshotFileName string
width, height int
sliderPosX, sliderPosY int
horizontalScale = float32(1.0)
verticalScale = float32(1.0)
shear = float32(1.0)
thickness = 3
lineType = 8
textFont = opencv.InitFont(opencv.CV_FONT_HERSHEY_SIMPLEX, horizontalScale, verticalScale, shear, thickness, lineType)
)
func processFrameAndUpdate() {
for {
if webCamera.GrabFrame() {
IplImgFrame := webCamera.RetrieveFrame(1)
if IplImgFrame != nil {
//IplImgFrame = opencv.Resize(IplImgFrame, 0, height-200, opencv.CV_INTER_LINEAR)
// https://godoc.org/github.com/lazywei/go-opencv/opencv#NewScalar
redColor := opencv.NewScalar(0, 0, 255, 0) // red - (blue, green, red, alpha)
cyanColor := opencv.NewScalar(255, 255, 0, 0) // cyan - (blue, green, red, alpha)
position := opencv.Point{sliderPosX, sliderPosY}
// see https://www.socketloop.com/tutorials/golang-get-current-time
currentTime := time.Now().Local().Format("2006-01-02 15:04:05 +0800")
textFont.PutText(IplImgFrame, "Hello World! ", position, redColor)
textFont.PutText(IplImgFrame, currentTime, opencv.Point{sliderPosX, sliderPosY + int(verticalScale*30.0)}, cyanColor)
win.ShowImage(IplImgFrame)
}
}
}
}
func main() {
// a new OpenCV window
win = opencv.NewWindow("Go-OpenCV camera feed for Gtk-GUI")
defer win.Destroy()
// activate webCamera
webCamera = opencv.NewCameraCapture(opencv.CV_CAP_ANY) // autodetect
if webCamera == nil {
panic("Unable to open camera")
}
defer webCamera.Release()
// get some data from camera
width = int(webCamera.GetProperty(opencv.CV_CAP_PROP_FRAME_WIDTH))
height = int(webCamera.GetProperty(opencv.CV_CAP_PROP_FRAME_HEIGHT))
fmt.Println("Camera width : ", width)
fmt.Println("Camera height : ", height)
// open up a new "pure" OpenCV window first
go processFrameAndUpdate() // goroutine to update feed from camera
// then our "floating" GTK toolbar
gtk.Init(nil)
window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
window.SetPosition(gtk.WIN_POS_CENTER)
window.SetTitle("Golang-GTK-OpenCV-AppleBooth-Example!")
window.SetIconName("gtk-dialog-info")
window.Connect("destroy", func(ctx *glib.CallbackContext) {
println("got destroy!", ctx.Data().(string))
gtk.MainQuit()
}, "Happy coding!")
vbox := gtk.NewVBox(false, 1)
//--------------------------------------------------------
// GtkVPaned
//--------------------------------------------------------
vpaned := gtk.NewVPaned()
vbox.Add(vpaned)
//--------------------------------------------------------
// GtkFrame
//--------------------------------------------------------
frame1 := gtk.NewFrame("Adjust X & Y co-ordinates to find top-left, top-right, bottom-left & bottom-right :")
framebox1 := gtk.NewVBox(false, 1)
frame1.Add(framebox1)
//--------------------------------------------------------
// GtkScale
//--------------------------------------------------------
scaleXHBox := gtk.NewHBox(false, 1)
scaleX := gtk.NewHScaleWithRange(0, float64(width), 1)
scaleX.Connect("value-changed", func() {
//println("scale:", int(scale.GetValue()))
sliderPosX = int(scaleX.GetValue())
statusbar.Push(statusbar.GetContextId("go-gtk"), "X : "+strconv.Itoa(sliderPosX)+" Y : "+strconv.Itoa(sliderPosY))
})
scaleXHBox.Add(scaleX)
framebox1.PackStart(scaleXHBox, false, false, 0)
scaleYHBox := gtk.NewHBox(false, 1)
scaleY := gtk.NewHScaleWithRange(0, float64(height), 1)
scaleY.Connect("value-changed", func() {
//println("scale:", int(scale.GetValue()))
sliderPosY = int(scaleY.GetValue())
statusbar.Push(statusbar.GetContextId("go-gtk"), "X : "+strconv.Itoa(sliderPosX)+" Y : "+strconv.Itoa(sliderPosY))
})
scaleYHBox.Add(scaleY)
framebox1.PackStart(scaleYHBox, false, false, 0)
vpaned.Pack1(frame1, false, false)
//--------------------------------------------------------
// GtkHBox
//--------------------------------------------------------
buttons := gtk.NewHBox(false, 1)
//--------------------------------------------------------
// GtkButton
//--------------------------------------------------------
quitButton := gtk.NewButtonWithLabel("Quit")
quitButton.Clicked(func() {
gtk.MainQuit()
})
buttons.Add(quitButton)
framebox1.PackStart(buttons, false, false, 0)
//--------------------------------------------------------
// GtkVSeparator
//--------------------------------------------------------
vsep := gtk.NewVSeparator()
framebox1.PackStart(vsep, false, false, 0)
statusbar = gtk.NewStatusbar()
//context_id := statusbar.GetContextId("go-gtk")
//--------------------------------------------------------
// GtkStatusbar
//--------------------------------------------------------
framebox1.PackStart(statusbar, false, false, 0)
//--------------------------------------------------------
// Event
//--------------------------------------------------------
window.Add(vbox)
window.SetSizeRequest(600, 130)
window.ShowAll()
gtk.Main()
}
References:
https://godoc.org/github.com/lazywei/go-opencv/opencv#Point
https://www.socketloop.com/tutorials/golang-get-current-time
See also : Golang : Detect number of faces or vehicles in a photo
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
+7.1k Golang : Dealing with postal or zip code example
+8.1k Golang : Find relative luminance or color brightness
+5.9k Golang : Grab news article text and use NLP to get each paragraph's sentences
+6.2k CodeIgniter : form input set_value cause " to become & quot
+12.2k Golang : 2 dimensional array example
+14.4k Golang : Execute function at intervals or after some delay
+9.2k Golang : How to get username from email address
+32.9k Delete a directory in Go
+16.4k Golang : Generate QR codes for Google Authenticator App and fix "Cannot interpret QR code" error
+12.6k Golang : Listen and Serve on sub domain example
+19.3k Golang : How to count the number of repeated characters in a string?
+19.9k Golang : How to get own program name during runtime ?