webcam/examples/main.go
2021-02-07 14:41:48 +01:00

269 lines
4.8 KiB
Go

package main
import (
//"bytes"
//"encoding/hex"
"fmt"
"image"
"image/jpeg"
"os"
//"net/http"
"git.giftfish.de/ston1th/webcam"
"time"
)
var frame []byte
var img image.Image
func main() {
cam, err := webcam.Open("/dev/video0", time.Second*5)
if err != nil {
panic(err.Error())
}
defer cam.Close()
ctrl := cam.GetControls()
for k, value := range ctrl {
fmt.Fprintln(os.Stderr, k)
for _, v := range value {
fmt.Fprintln(os.Stderr, " "+v)
}
}
// https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/control.html#control-ids
err = cam.SetControl(webcam.V4L2_CID_CONTRAST, 0)
if err != nil {
panic(err.Error())
}
formats := cam.GetPixelFormats()
println("Available formats: ")
for k, value := range formats {
fmt.Fprintln(os.Stderr, k, value)
}
//choice := readChoice(fmt.Sprintf("Choose format [1-%d]: ", len(formats)))
//format := formats[1]
format := uint32(1196444237) // MJPEG
//format := PixelFormat(1448695129) // YUV
fmt.Fprintf(os.Stderr, "Supported frame sizes for format %s\n", formats[format])
fs := cam.GetFrameSizes(format)
for _, f := range fs {
fmt.Fprintln(os.Stderr, f)
}
//choice = readChoice(fmt.Sprintf("Choose format [1-%d]: ", len(frames)))
s := fs[5]
f, w, h, err := cam.SetImageFormat(format, s.MaxWidth, s.MaxHeight)
if err != nil {
panic(err.Error())
} else {
fmt.Fprintf(os.Stderr, "Resulting image format: %s (%dx%d)\n", formats[f], w, h)
}
fmt.Fprintf(os.Stderr, "Press Enter to start streaming\n")
fmt.Scanf("\n")
err = cam.StartStreaming()
if err != nil {
panic(err.Error())
}
for {
err = cam.WaitForFrame()
switch err.(type) {
case nil:
case webcam.TimeoutErr:
continue
default:
panic(err.Error())
}
//frm, err := cam.ReadFrame()
o := jpeg.Options{100}
img, err := cam.ReadJPEG()
jpeg.Encode(os.Stdout, img, &o)
if err == nil {
//print(".")
//os.Stdout.Write(frm)
os.Stdout.Sync()
}
}
}
/*
buf := bytes.NewBuffer(frm)
img, err = jpeg.Decode(buf)
if err != nil {
panic(err.Error())
}
http.HandleFunc("/", handler)
panic(http.ListenAndServe(":8090", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
err := jpeg.Encode(w, img, nil)
println(err)
}
/*
imgchan := make(chan *image.Image)
pr, pw := io.Pipe()
go func() {
for {
frm, err := cam.ReadFrame()
if err == nil {
pw.Write(frm)
}
time.Sleep(time.Second)
}
}()
go func() {
img, err := mjpeg.Decode(pr)
if err != nil {
fmt.Println(err)
}
}()
dec <- imgchan
http.HandleFunc("/", handler)
http.HandleFunc("/frame", handler2)
panic(http.ListenAndServe(":8090", nil))
}
func handler2(w http.ResponseWriter, r *http.Request) {
_, err := w.Write(frame)
println(err)
}
func handler(w http.ResponseWriter, r *http.Request) {
err := jpeg.Encode(w, *dec, nil)
println(err)
}*/
/*package main
import (
"bytes"
fmt "fmt"
"image"
"image/jpeg"
"net/http"
)
var frame []byte
var dec image.Image
func main() {
cam, err := Open("/dev/video0")
if err != nil {
panic(err.Error())
}
defer cam.Close()
err = cam.StartStreaming()
if err != nil {
panic(err.Error())
}
for {
frame, err = cam.ReadFrame()
if err == nil {
break
}
}
dec, err = jpeg.Decode(bytes.NewBuffer(frame))
if err != nil {
fmt.Println(err)
}
http.HandleFunc("/", handler)
panic(http.ListenAndServe(":8090", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
err := jpeg.Encode(w, dec, nil)
println(err)
}*/
/*import (
"fmt"
"image"
"image/color"
"image/jpeg"
"net/http"
"os"
)
const X = 800
const Y = 600
func div(f1, f2 float64) float64 {
return ((f1 - f2) / f1) * 100
}
func check(i1, i2 uint32) bool {
if i1 == i2 {
return false
}
if i1 == 0 {
return false
}
if i2 == 0 {
return false
}
f1 := float64(i1)
f2 := float64(i2)
if div(f1, f2) > 5.00 {
return true
}
return false
}
func comp(p1, p2 image.Image) image.Image {
red := color.RGBA{255, 0, 0, 0}
n := image.NewRGBA(p1.Bounds())
for i := 0; i < X; i++ {
for j := 0; j < Y; j++ {
r1, g1, b1, _ := p1.At(i, j).RGBA()
r2, g2, b2, _ := p2.At(i, j).RGBA()
if check(r1, r2) || check(g1, g2) || check(b1, b2) {
n.Set(i, j, red)
continue
}
n.Set(i, j, p1.At(i, j))
}
}
return n
}
var img image.Image
var test image.Image
func main() {
f1, err := os.Open("pic1.jpeg")
fmt.Println(err)
f2, err := os.Open("pic2.jpeg")
fmt.Println(err)
p1, _, err := image.Decode(f1)
fmt.Println(err)
p2, _, err := image.Decode(f2)
fmt.Println(err)
img = comp(p1, p2)
test = p1
http.HandleFunc("/", handler)
http.HandleFunc("/test", handler2)
panic(http.ListenAndServe(":8090", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println(jpeg.Encode(w, img, nil))
}
func handler2(w http.ResponseWriter, r *http.Request) {
fmt.Println(jpeg.Encode(w, test, nil))
}*/