func ProcessImage(img *opencv.IplImage, win *opencv.Window, pos int) error { w := img.Width() h := img.Height() // Create the output image cedge := opencv.CreateImage(w, h, opencv.IPL_DEPTH_8U, 3) defer cedge.Release() // Convert to grayscale gray := opencv.CreateImage(w, h, opencv.IPL_DEPTH_8U, 1) edge := opencv.CreateImage(w, h, opencv.IPL_DEPTH_8U, 1) defer gray.Release() defer edge.Release() opencv.CvtColor(img, gray, opencv.CV_BGR2GRAY) opencv.Smooth(gray, edge, opencv.CV_BLUR, 3, 3, 0, 0) opencv.Not(gray, edge) // Run the edge detector on grayscale opencv.Canny(gray, edge, float64(pos), float64(pos*3), 3) opencv.Zero(cedge) // copy edge points opencv.Copy(img, cedge, edge) win.ShowImage(cedge) return nil }
func main() { runtime.GOMAXPROCS(runtime.NumCPU()) gbot := gobot.NewGobot() _, currentfile, _, _ := runtime.Caller(0) cascade := path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml") window := opencv.NewWindowDriver("window") camera := opencv.NewCameraDriver("camera", "tcp://192.168.1.1:5555") ardroneAdaptor := ardrone.NewArdroneAdaptor("Drone") drone := ardrone.NewArdroneDriver(ardroneAdaptor, "drone") work := func() { detect := false drone.TakeOff() var image *cv.IplImage gobot.On(camera.Events["Frame"], func(data interface{}) { image = data.(*cv.IplImage) if detect == false { window.ShowImage(image) } }) gobot.On(drone.Events["Flying"], func(data interface{}) { gobot.After(1*time.Second, func() { drone.Up(0.2) }) gobot.After(2*time.Second, func() { drone.Hover() }) gobot.After(5*time.Second, func() { detect = true gobot.Every(300*time.Millisecond, func() { drone.Hover() i := image faces := opencv.DetectFaces(cascade, i) biggest := 0 var face *cv.Rect for _, f := range faces { if f.Width() > biggest { biggest = f.Width() face = f } } if face != nil { opencv.DrawRectangles(i, []*cv.Rect{face}, 0, 255, 0, 5) centerX := float64(image.Width()) * 0.5 turn := -(float64(face.X()) - centerX) / centerX fmt.Println("turning:", turn) if turn < 0 { drone.Clockwise(math.Abs(turn * 0.4)) } else { drone.CounterClockwise(math.Abs(turn * 0.4)) } } window.ShowImage(i) }) gobot.After(20*time.Second, func() { drone.Land() }) }) }) } gbot.Robots = append(gbot.Robots, gobot.NewRobot("face", []gobot.Connection{ardroneAdaptor}, []gobot.Device{window, camera, drone}, work)) gbot.Start() }