From 4f101ef4773cdbf7478747effae9b9dfdc97e7ac Mon Sep 17 00:00:00 2001 From: "wanglei.w" Date: Mon, 5 Jul 2021 00:06:28 +0800 Subject: [PATCH] add example for gocv --- examples/opencv.go | 112 ------------------- examples/opencv_test.go | 197 ++++++++++++++++++++++++++++++++++ examples/sample_data/out1.mp4 | Bin 74823 -> 0 bytes ffmpeg_test.go | 38 +++++++ filters.go | 30 +++--- view.go | 1 + 6 files changed, 251 insertions(+), 127 deletions(-) delete mode 100644 examples/opencv.go create mode 100644 examples/opencv_test.go delete mode 100644 examples/sample_data/out1.mp4 diff --git a/examples/opencv.go b/examples/opencv.go deleted file mode 100644 index 00ee6cf..0000000 --- a/examples/opencv.go +++ /dev/null @@ -1,112 +0,0 @@ -// +build gocv - -package examples - -import ( - "fmt" - "image" - "image/color" - "io" - "log" - - ffmpeg "github.com/u2takey/ffmpeg-go" - "gocv.io/x/gocv" -) - -func TestExampleOpenCvFaceDetect(t *testing.T) { - ExampleFaceDetection("./sample_data/head-pose-face-detection-male-short.mp4", - "./sample_data/haarcascade_frontalface_default.xml") -} - -func readProcess(infileName string, writer io.WriteCloser) <-chan error { - log.Println("Starting ffmpeg process1") - done := make(chan error) - go func() { - err := ffmpeg.Input(infileName). - Output("pipe:", - ffmpeg.KwArgs{ - "format": "rawvideo", "pix_fmt": "rgb24", - }). - WithOutput(writer). - Run() - log.Println("ffmpeg process1 done") - _ = writer.Close() - done <- err - close(done) - }() - return done -} - -func openCvProcess(xmlFile string, reader io.ReadCloser, w, h int) { - // open display window - window := gocv.NewWindow("Face Detect") - defer window.Close() - - // color for the rect when faces detected - blue := color.RGBA{0, 0, 255, 0} - - classifier := gocv.NewCascadeClassifier() - defer classifier.Close() - - if !classifier.Load(xmlFile) { - fmt.Printf("Error reading cascade file: %v\n", xmlFile) - return - } - - frameSize := w * h * 3 - buf := make([]byte, frameSize, frameSize) - for { - n, err := io.ReadFull(reader, buf) - if n == 0 || err == io.EOF { - return - } else if n != frameSize || err != nil { - panic(fmt.Sprintf("read error: %d, %s", n, err)) - } - img, err := gocv.NewMatFromBytes(h, w, gocv.MatTypeCV8UC3, buf) - if err != nil { - fmt.Println("decode fail", err) - } - if img.Empty() { - continue - } - img2 := gocv.NewMat() - gocv.CvtColor(img, &img2, gocv.ColorBGRToRGB) - - // detect faces - rects := classifier.DetectMultiScale(img2) - fmt.Printf("found %d faces\n", len(rects)) - - // draw a rectangle around each face on the original image, - // along with text identifing as "Human" - for _, r := range rects { - gocv.Rectangle(&img2, r, blue, 3) - - size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2) - pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2) - gocv.PutText(&img2, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2) - } - - // show the image in the window, and wait 1 millisecond - window.IMShow(img2) - img.Close() - img2.Close() - if window.WaitKey(10) >= 0 { - break - } - } - return -} - -func ExampleFaceDetection(inputFile, xmlFile string) { - w, h := getVideoSize(inputFile) - log.Println(w, h) - - pr1, pw1 := io.Pipe() - done1 := readProcess(inputFile, pw1) - openCvProcess(xmlFile, pr1, w, h) - err := <-done1 - if err != nil { - panic(err) - } - log.Println("Done") -} diff --git a/examples/opencv_test.go b/examples/opencv_test.go new file mode 100644 index 0000000..95024e1 --- /dev/null +++ b/examples/opencv_test.go @@ -0,0 +1,197 @@ +// +build gocv + +// uncomment line above for gocv examples + +package examples + +import ( + "fmt" + "image" + "image/color" + "io" + "log" + "testing" + + ffmpeg "github.com/u2takey/ffmpeg-go" + "gocv.io/x/gocv" +) + +// TestExampleOpenCvFaceDetect will: take a video as input => use opencv for face detection => draw box and show a window +// This example depends on gocv and opencv, please refer: https://pkg.go.dev/gocv.io/x/gocv for installation. +func TestExampleOpenCvFaceDetectWithVideo(t *testing.T) { + inputFile := "./sample_data/head-pose-face-detection-male-short.mp4" + xmlFile := "./sample_data/haarcascade_frontalface_default.xml" + + w, h := getVideoSize(inputFile) + log.Println(w, h) + + pr1, pw1 := io.Pipe() + readProcess(inputFile, pw1) + openCvProcess(xmlFile, pr1, w, h) + log.Println("Done") +} + +func readProcess(infileName string, writer io.WriteCloser) { + log.Println("Starting ffmpeg process1") + go func() { + err := ffmpeg.Input(infileName). + Output("pipe:", + ffmpeg.KwArgs{ + "format": "rawvideo", "pix_fmt": "rgb24", + }). + WithOutput(writer). + ErrorToStdOut(). + Run() + log.Println("ffmpeg process1 done") + _ = writer.Close() + if err != nil { + panic(err) + } + }() + return +} + +func openCvProcess(xmlFile string, reader io.ReadCloser, w, h int) { + // open display window + window := gocv.NewWindow("Face Detect") + defer window.Close() + + // color for the rect when faces detected + blue := color.RGBA{B: 255} + + classifier := gocv.NewCascadeClassifier() + defer classifier.Close() + + if !classifier.Load(xmlFile) { + fmt.Printf("Error reading cascade file: %v\n", xmlFile) + return + } + + frameSize := w * h * 3 + buf := make([]byte, frameSize, frameSize) + for { + n, err := io.ReadFull(reader, buf) + if n == 0 || err == io.EOF { + return + } else if n != frameSize || err != nil { + panic(fmt.Sprintf("read error: %d, %s", n, err)) + } + img, err := gocv.NewMatFromBytes(h, w, gocv.MatTypeCV8UC3, buf) + if err != nil { + fmt.Println("decode fail", err) + } + if img.Empty() { + continue + } + img2 := gocv.NewMat() + gocv.CvtColor(img, &img2, gocv.ColorBGRToRGB) + + // detect faces + rects := classifier.DetectMultiScale(img2) + fmt.Printf("found %d faces\n", len(rects)) + + // draw a rectangle around each face on the original image, along with text identifing as "Human" + for _, r := range rects { + gocv.Rectangle(&img2, r, blue, 3) + + size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2) + pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2) + gocv.PutText(&img2, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2) + } + + // show the image in the window, and wait 1 millisecond + window.IMShow(img2) + img.Close() + img2.Close() + if window.WaitKey(10) >= 0 { + break + } + } + return +} + +// TestExampleOpenCvFaceDetectWithCamera will: task stream from webcam => use opencv for face detection => output with ffmpeg +// This example depends on gocv and opencv, please refer: https://pkg.go.dev/gocv.io/x/gocv for installation. +func TestExampleOpenCvFaceDetectWithCamera(t *testing.T) { + deviceID := "0" // camera device id + xmlFile := "./sample_data/haarcascade_frontalface_default.xml" + + webcam, err := gocv.OpenVideoCapture(deviceID) + if err != nil { + fmt.Printf("error opening video capture device: %v\n", deviceID) + return + } + defer webcam.Close() + + // prepare image matrix + img := gocv.NewMat() + defer img.Close() + + if ok := webcam.Read(&img); !ok { + panic(fmt.Sprintf("Cannot read device %v", deviceID)) + } + fmt.Printf("img: %vX%v\n", img.Cols(), img.Rows()) + + pr1, pw1 := io.Pipe() + writeProcess("./sample_data/face_detect.mp4", pr1, img.Cols(), img.Rows()) + + // color for the rect when faces detected + blue := color.RGBA{B: 255} + + // load classifier to recognize faces + classifier := gocv.NewCascadeClassifier() + defer classifier.Close() + + if !classifier.Load(xmlFile) { + fmt.Printf("Error reading cascade file: %v\n", xmlFile) + return + } + + fmt.Printf("Start reading device: %v\n", deviceID) + for i := 0; i < 200; i++ { + if ok := webcam.Read(&img); !ok { + fmt.Printf("Device closed: %v\n", deviceID) + return + } + if img.Empty() { + continue + } + + // detect faces + rects := classifier.DetectMultiScale(img) + fmt.Printf("found %d faces\n", len(rects)) + + // draw a rectangle around each face on the original image, along with text identifing as "Human" + for _, r := range rects { + gocv.Rectangle(&img, r, blue, 3) + + size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2) + pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2) + gocv.PutText(&img, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2) + } + pw1.Write(img.ToBytes()) + } + pw1.Close() + log.Println("Done") +} + +func writeProcess(outputFile string, reader io.ReadCloser, w, h int) { + log.Println("Starting ffmpeg process1") + go func() { + err := ffmpeg.Input("pipe:", + ffmpeg.KwArgs{"format": "rawvideo", + "pix_fmt": "bgr24", "s": fmt.Sprintf("%dx%d", w, h), + }). + Overlay(ffmpeg.Input("./sample_data/overlay.png"), ""). + Output(outputFile). + WithInput(reader). + ErrorToStdOut(). + OverWriteOutput(). + Run() + log.Println("ffmpeg process1 done") + if err != nil { + panic(err) + } + _ = reader.Close() + }() +} diff --git a/examples/sample_data/out1.mp4 b/examples/sample_data/out1.mp4 deleted file mode 100644 index 91de80469011ca4f96b0b2b9544be7f6ccfe66af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74823 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%0A(H7j?Rg467a&gPNnEV+W`FFhk@_>P= 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 diff --git a/ffmpeg_test.go b/ffmpeg_test.go index efc47e1..4b1fb39 100644 --- a/ffmpeg_test.go +++ b/ffmpeg_test.go @@ -84,6 +84,31 @@ func TestSimpleOutputArgs(t *testing.T) { "2", "-vf", "fps=3", "imageFromVideo_%d.jpg"}, cmd.GetArgs()) } +func TestAutomaticStreamSelection(t *testing.T) { + // example from http://ffmpeg.org/ffmpeg-all.html + input := []*Stream{Input("A.avi"), Input("B.mp4")} + out1 := Output(input, "out1.mkv") + out2 := Output(input, "out2.wav") + out3 := Output(input, "out3.mov", KwArgs{"map": "1:a", "c:a": "copy"}) + cmd := MergeOutputs(out1, out2, out3) + printArgs(cmd.GetArgs()) + printGraph(cmd) +} + +func TestLabeledFiltergraph(t *testing.T) { + // example from http://ffmpeg.org/ffmpeg-all.html + in1, in2, in3 := Input("A.avi"), Input("B.mp4"), Input("C.mkv") + in2Split := in2.Get("v").Hue(KwArgs{"s": 0}).Split() + overlay := Filter([]*Stream{in1, in2}, "overlay", nil) + aresample := Filter([]*Stream{in1, in2, in3}, "aresample", nil) + out1 := Output([]*Stream{in2Split.Get("outv1"), overlay, aresample}, "out1.mp4", KwArgs{"an": ""}) + out2 := Output([]*Stream{in1, in2, in3}, "out2.mkv") + out3 := in2Split.Get("outv2").Output("out3.mkv", KwArgs{"map": "1:a:0"}) + cmd := MergeOutputs(out1, out2, out3) + printArgs(cmd.GetArgs()) + printGraph(cmd) +} + func ComplexFilterExample() *Stream { split := Input(TestInputFile1).VFlip().Split() split0, split1 := split.Get("0"), split.Get("1") @@ -311,6 +336,19 @@ func TestView(t *testing.T) { t.Log(b) } +func printArgs(args []string) { + for _, a := range args { + fmt.Printf("%s ", a) + } + fmt.Println() +} + +func printGraph(s *Stream) { + fmt.Println() + v, _ := s.View(ViewTypeFlowChart) + fmt.Println(v) +} + //func TestAvFoundation(t *testing.T) { // out := Input("default:none", KwArgs{"f": "avfoundation", "framerate": "30"}). // Output("output.mp4", KwArgs{"format": "mp4"}). diff --git a/filters.go b/filters.go index ad5c6a0..725fec7 100644 --- a/filters.go +++ b/filters.go @@ -5,7 +5,7 @@ import ( "strconv" ) -func AssetType(hasType, expectType string, action string) { +func AssertType(hasType, expectType string, action string) { if hasType != expectType { panic(fmt.Sprintf("cannot %s on non-%s", action, expectType)) } @@ -20,32 +20,32 @@ func Filter(streamSpec []*Stream, filterName string, args Args, kwArgs ...KwArgs } func (s *Stream) Filter(filterName string, args Args, kwArgs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "filter") + AssertType(s.Type, "FilterableStream", "filter") return Filter([]*Stream{s}, filterName, args, MergeKwArgs(kwArgs)) } func (s *Stream) Split() *Node { - AssetType(s.Type, "FilterableStream", "split") + AssertType(s.Type, "FilterableStream", "split") return NewFilterNode("split", []*Stream{s}, 1, nil, nil) } func (s *Stream) ASplit() *Node { - AssetType(s.Type, "FilterableStream", "asplit") + AssertType(s.Type, "FilterableStream", "asplit") return NewFilterNode("asplit", []*Stream{s}, 1, nil, nil) } func (s *Stream) SetPts(expr string) *Node { - AssetType(s.Type, "FilterableStream", "setpts") + AssertType(s.Type, "FilterableStream", "setpts") return NewFilterNode("setpts", []*Stream{s}, 1, []string{expr}, nil) } func (s *Stream) Trim(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "trim") + AssertType(s.Type, "FilterableStream", "trim") return NewFilterNode("trim", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } func (s *Stream) Overlay(overlayParentNode *Stream, eofAction string, kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "overlay") + AssertType(s.Type, "FilterableStream", "overlay") if eofAction == "" { eofAction = "repeat" } @@ -55,24 +55,24 @@ func (s *Stream) Overlay(overlayParentNode *Stream, eofAction string, kwargs ... } func (s *Stream) HFlip(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "hflip") + AssertType(s.Type, "FilterableStream", "hflip") return NewFilterNode("hflip", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } func (s *Stream) VFlip(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "vflip") + AssertType(s.Type, "FilterableStream", "vflip") return NewFilterNode("vflip", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } func (s *Stream) Crop(x, y, w, h int, kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "crop") + AssertType(s.Type, "FilterableStream", "crop") return NewFilterNode("crop", []*Stream{s}, 1, []string{ strconv.Itoa(w), strconv.Itoa(h), strconv.Itoa(x), strconv.Itoa(y), }, MergeKwArgs(kwargs)).Stream("", "") } func (s *Stream) DrawBox(x, y, w, h int, color string, thickness int, kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "drawbox") + AssertType(s.Type, "FilterableStream", "drawbox") args := MergeKwArgs(kwargs) if thickness != 0 { args["t"] = thickness @@ -83,7 +83,7 @@ func (s *Stream) DrawBox(x, y, w, h int, color string, thickness int, kwargs ... } func (s *Stream) Drawtext(text string, x, y int, escape bool, kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "drawtext") + AssertType(s.Type, "FilterableStream", "drawtext") args := MergeKwArgs(kwargs) if escape { text = fmt.Sprintf("%q", text) @@ -119,17 +119,17 @@ func (s *Stream) Concat(streams []*Stream, kwargs ...KwArgs) *Stream { } func (s *Stream) ZoomPan(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "zoompan") + AssertType(s.Type, "FilterableStream", "zoompan") return NewFilterNode("zoompan", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } func (s *Stream) Hue(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "hue") + AssertType(s.Type, "FilterableStream", "hue") return NewFilterNode("hue", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } // todo fix this func (s *Stream) ColorChannelMixer(kwargs ...KwArgs) *Stream { - AssetType(s.Type, "FilterableStream", "colorchannelmixer") + AssertType(s.Type, "FilterableStream", "colorchannelmixer") return NewFilterNode("colorchannelmixer", []*Stream{s}, 1, nil, MergeKwArgs(kwargs)).Stream("", "") } diff --git a/view.go b/view.go index 8eb2bf7..9c1cbce 100644 --- a/view.go +++ b/view.go @@ -81,6 +81,7 @@ func visualizeForMermaidAsFlowChart(s *Stream) (string, error) { next := outGoingMap[node.Hash()] for k, v := range next { for _, nextNode := range v { + // todo ignore merged output label := string(k) if label == "" { label = "<>"