Golang : Detect number of faces or vehicles in a photo
This is a short tutorial on how to use OpenCV to detect the number of faces in an image. Knowing the number of faces in a given photo is crucial in developing machine learning capabilities that involve computer vision.
For examples,
1) A robot needs to know how many people to serve glasses of water.
2) A driverless car needs to know how many incoming cars and number of passengers in the car. IF the drive seat position has a face, chances are the incoming car is in motion.
In this example, we will learn how to detect the number of human faces with a command line Golang program and report the number. If you're looking to detect cars, use the HAAR cascade file for vehicle detection or download the XML files at https://github.com/abhi-kumar/CAR-DETECTION/blob/master/checkcas.xml or http://cogcomp.cs.illinois.edu/Data/Car/
If you need to detect more specific data such as eyes, ears, etc. Use the cascade files at https://github.com/opencv/opencv/tree/master/data/haarcascades.
Here you go!
package main
import (
"fmt"
"github.com/lazywei/go-opencv/opencv"
"image"
gif "image/gif"
_ "image/jpeg"
_ "image/png"
"net/http"
"os"
)
// global variables
var (
cascade = new(opencv.HaarCascade)
)
func errCheck(err error) {
if err != nil {
panic(err)
}
}
func main() {
if len(os.Args) != 2 {
fmt.Printf("Usage : %s <imagefilename>\n", os.Args[0])
os.Exit(0)
}
imageFileName := os.Args[1]
fmt.Println("Analyzing [" + imageFileName + "]......")
// we will use Go's method of load images
// instead of openCV.LoadImage
// because we want to detect if the user supplies animated GIF or not
imageFile, err := os.Open(imageFileName)
errCheck(err)
defer imageFile.Close()
img, _, err := image.Decode(imageFile)
errCheck(err)
buffer := make([]byte, 512)
imageFile.Seek(0, 0) // reset reader
_, err = imageFile.Read(buffer)
errCheck(err)
filetype := http.DetectContentType(buffer)
// check if image is GIF and if yes, check to see if it is animated GIF by
// counting the LoopCount number
fmt.Println("Analyzing image type : ", filetype)
if filetype == "image/gif" {
imageFile.Seek(0, 0)
// warn if image is animated GIF
gif, err := gif.DecodeAll(imageFile)
errCheck(err)
if gif.LoopCount != 0 {
fmt.Println("Animated gif detected. Will only scan for faces in the 1st frame.")
}
}
// for vehicles XML files
// see https://github.com/abhi-kumar/CAR-DETECTION/blob/master/checkcas.xml
// or http://cogcomp.cs.illinois.edu/Data/Car/
cascade = opencv.LoadHaarClassifierCascade("./haarcascade_frontalface_alt.xml")
defer cascade.Release()
// convert Go's image.Image type to OpenCV's IplImage(Intel Image Processing Library)
openCVimg := opencv.FromImage(img)
defer openCVimg.Release()
if openCVimg != nil {
faces := cascade.DetectObjects(openCVimg)
fmt.Printf("Detected [%v] faces in image.\n", len(faces)) // <------- here !
} else {
panic("OpenCV FromImage error")
}
}
Sample output:
./detectfaces input.gif
Analyzing [input.gif]......
Analyzing image type : image/gif
Detected 1 faces in image.
./detectfaces img.gif
Analyzing [img.gif]......
Analyzing image type : image/gif
Animated gif detected. Will only scan for faces in the 1st frame.
Detected [0] faces in image.
References:
https://github.com/opencv/opencv/tree/master/data/haarcascades
http://stackoverflow.com/questions/25775650/golang-async-face-detection
See also : Golang : Surveillance with web camera and OpenCV
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
+86.9k Golang : How to convert character to ASCII and back
+11.8k Golang : Convert a rune to unicode style string \u
+13.9k Golang : Reverse IP address for reverse DNS lookup example
+7.2k Golang : How to iterate a slice without using for loop?
+6.3k PHP : Proper way to get UTF-8 character or string length
+11k Golang : Proper way to test CIDR membership of an IP 4 or 6 address example
+8.8k Golang : What is the default port number for connecting to MySQL/MariaDB database ?
+6k Golang : Build new URL for named or registered route with Gorilla webtoolkit example
+6.8k Golang : Calculate BMI and risk category
+6.5k Elasticsearch : Shutdown a local node
+13.9k Golang : Compress and decompress file with compress/flate example
+3.9k Detect if Google Analytics and Developer Media are loaded properly or not