269 lines
4.8 KiB
Go
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))
|
|
}*/
|