Skip to content

Instantly share code, notes, and snippets.

@timakin
Created June 8, 2017 06:04
Show Gist options
  • Save timakin/6a9b6d5da8d5f68b81e72a78975d4521 to your computer and use it in GitHub Desktop.
Save timakin/6a9b6d5da8d5f68b81e72a78975d4521 to your computer and use it in GitHub Desktop.
image recognition
package main
import (
"errors"
"fmt"
"image"
"image/jpeg"
"image/png"
"log"
"os"
"github.com/k0kubun/pp"
"github.com/muesli/smartcrop"
"github.com/nfnt/resize"
)
type SubImager interface {
SubImage(r image.Rectangle) image.Image
}
func writeImageToPng(img *image.Image, name string) {
fso, err := os.Create(name)
if err != nil {
panic(err)
}
defer fso.Close()
err = png.Encode(fso, (*img))
if err != nil {
panic(err)
}
}
func writeImageToJpeg(img *image.Image, name string) {
fso, err := os.Create(name)
if err != nil {
panic(err)
}
defer fso.Close()
err = jpeg.Encode(fso, (*img), &jpeg.Options{Quality: 100})
if err != nil {
panic(err)
}
}
func main() {
fi, err := os.Open("fbda80a59cbe4875bf769ff30d94d3a0.jpg")
if err != nil {
log.Fatalf(err.Error())
}
defer fi.Close()
img, _, err := image.Decode(fi)
if err != nil {
log.Fatalf(err.Error())
}
faceDetectionHaarCascade := "./haarcascade_frontalface_alt.xml"
cropSettings := smartcrop.CropSettings{
FaceDetection: true,
FaceDetectionHaarCascadeFilepath: faceDetectionHaarCascade,
InterpolationType: resize.Bicubic,
DebugMode: false,
}
analyzer := smartcrop.NewAnalyzerWithCropSettings(cropSettings)
topCrop, err := analyzer.FindBestCrop(img, 400, 200)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Printf("Top crop: %+v\n", topCrop)
sub, ok := img.(SubImager)
if ok {
log.Print(pp.Sprint(img))
cropImage := sub.SubImage(image.Rect(topCrop.X, topCrop.Y, topCrop.Width+topCrop.X, topCrop.Height+topCrop.Y))
pp.Sprint(cropImage)
writeImageToJpeg(&cropImage, "./smartcrop.jpg")
} else {
pp.Sprint("============")
log.Fatal(errors.New("No SubImage support"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment