gobot.io/x/gobot@v1.16.0/examples/ardrone_face_tracking.go (about) 1 // +build example 2 // 3 // Do not build by default. 4 5 package main 6 7 import ( 8 "fmt" 9 "math" 10 "path" 11 "runtime" 12 "time" 13 14 "gobot.io/x/gobot" 15 "gobot.io/x/gobot/platforms/opencv" 16 "gobot.io/x/gobot/platforms/parrot/ardrone" 17 "gocv.io/x/gocv" 18 ) 19 20 func main() { 21 runtime.GOMAXPROCS(runtime.NumCPU()) 22 23 _, currentfile, _, _ := runtime.Caller(0) 24 cascade := path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml") 25 window := opencv.NewWindowDriver() 26 camera := opencv.NewCameraDriver("tcp://192.168.1.1:5555") 27 ardroneAdaptor := ardrone.NewAdaptor() 28 drone := ardrone.NewDriver(ardroneAdaptor) 29 30 work := func() { 31 detect := false 32 drone.TakeOff() 33 var img gocv.Mat 34 camera.On(opencv.Frame, func(data interface{}) { 35 img = data.(gocv.Mat) 36 if !detect { 37 window.IMShow(img) 38 window.WaitKey(1) 39 } 40 }) 41 drone.On(ardrone.Flying, func(data interface{}) { 42 gobot.After(1*time.Second, func() { drone.Up(0.2) }) 43 gobot.After(2*time.Second, func() { drone.Hover() }) 44 gobot.After(5*time.Second, func() { 45 detect = true 46 gobot.Every(300*time.Millisecond, func() { 47 drone.Hover() 48 i := img 49 faces := opencv.DetectObjects(cascade, i) 50 biggest := 0 51 var face image.Rectangle 52 for _, f := range faces { 53 if f.Width() > biggest { 54 biggest = f.Width() 55 face = f 56 } 57 } 58 if face != nil { 59 opencv.DrawRectangles(i, []img.Rectangle{face}, 0, 255, 0, 5) 60 centerX := float64(img.Size()).X * 0.5 61 turn := -(float64(face.Min.X - centerX)) / centerX 62 fmt.Println("turning:", turn) 63 if turn < 0 { 64 drone.Clockwise(math.Abs(turn * 0.4)) 65 } else { 66 drone.CounterClockwise(math.Abs(turn * 0.4)) 67 } 68 } 69 window.IMShow(i) 70 window.WaitKey(1) 71 }) 72 gobot.After(20*time.Second, func() { drone.Land() }) 73 }) 74 }) 75 } 76 77 robot := gobot.NewRobot("face", 78 []gobot.Connection{ardroneAdaptor}, 79 []gobot.Device{window, camera, drone}, 80 work, 81 ) 82 83 robot.Start() 84 }