Golang : Activate web camera and broadcast out base64 encoded images
For this tutorial, we will learn how to activate web camera with Golang + OpenCV and stream out base64 encoded images via HTTP server. This tutorial is derived from the lesson that I use to teach my son on the subject of computer vision and Golang. It is based on the Go-OpenCV tutorial on activating web camera (https://github.com/lazywei/go-opencv/blob/master/samples/webcam.go).
The program will activate the web camera when you point your web browser to localhost:8080
and begin streaming out base64 encoded images. You will have to scroll down the see the new images. LOL! Good enough to get a 3 years old kid excited about computer vision.
Before you start.
go get github.com/lazywei/go-opencv
Here you go!
package main
import (
"bytes"
"encoding/base64"
"fmt"
"github.com/lazywei/go-opencv/opencv"
"image/png"
"net/http"
)
func broadcast(w http.ResponseWriter, r *http.Request) {
webCamera := opencv.NewCameraCapture(0)
if webCamera == nil {
panic("Unable to open camera")
}
defer webCamera.Release()
for {
if webCamera.GrabFrame() {
imgFrame := webCamera.RetrieveFrame(1)
if imgFrame != nil {
//fmt.Println(imgFrame.ImageSize())
//fmt.Println(imgFrame.ToImage())
// convert IplImage(Intel Image Processing Library)
// to image.Image
goImgFrame := imgFrame.ToImage()
// and then convert to []byte
// with the help of png.Encode() function
frameBuffer := new(bytes.Buffer)
//frameBuffer := make([]byte, imgFrame.ImageSize())
err := png.Encode(frameBuffer, goImgFrame)
if err != nil {
panic(err)
}
// convert the buffer bytes to base64 string - use buf.Bytes() for new image
imgBase64Str := base64.StdEncoding.EncodeToString(frameBuffer.Bytes())
// Embed into an html without PNG file
img2html := "<html><body><img src=\"data:image/png;base64," + imgBase64Str + "\" /></body></html>"
w.Write([]byte(fmt.Sprintf(img2html)))
// TODO :
// encode frames to stream via WebRTC
fmt.Println("Streaming....")
}
}
}
}
func main() {
fmt.Println("Broadcasting...")
mux := http.NewServeMux()
mux.HandleFunc("/", broadcast)
http.ListenAndServe(":8080", mux)
}
streaming out base64 encoded images to browser
NOTES:
In case you get these error messages :
No package 'opencv' found
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKGCONFIGPATH environment variable
Fix this problem by installing openCV.
On MacOSX :
>brew install homebrew/science/opencv
References:
https://github.com/lazywei/go-opencv/blob/master/opencv/goimage.go
https://www.socketloop.com/references/golang-net-http-servecontent-function-example
http://stackoverflow.com/questions/35667501/golang-seeking-through-a-video-serving-as-bytes
See also : Golang : Save webcamera frames to video file
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
+5.4k Ubuntu : connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream
+9.5k Golang : Convert(cast) bigint to string
+16.1k Golang : Padding data for encryption and un-padding data for decryption
+9.8k Golang : Display list of countries and ISO codes
+7.8k Golang : Print how to use flag for your application example
+16.6k Golang : Set, Get and List environment variables
+15.2k Golang : Login and logout a user after password verification and redirect example
+16.5k Golang : Write file with io.WriteString
+17.5k nginx: [emerg] unknown directive "passenger_enabled"
+5k Mac/Linux/Windows : Get CPU information from command line
+8k Golang : Embed secret text string into binary(executable) file
+5.5k Android Studio : How to detect camera, activate and capture example