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