728x90
이 포스트에서는 golang과 gocv를 이용해 웹캠 이미지를 스트리밍 하는 서버를 구현해 봤다.
gocv에 대해 모르고 있다면 여기를 먼저 보고 오도록 하자.
구현한 코드에서는 먼저 gocv로 웹캠을 연결하여 프레임을 받아온다. 이 프레임을 이미지로 변환한 다음, http 프로토콜로 전송한다.
package main
import (
"bytes"
"fmt"
"image/jpeg"
"log"
"net/http"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.OpenVideoCapture(0)
if err != nil {
log.Fatalf("Error opening webcam: %v", err)
}
defer webcam.Close()
frame := gocv.NewMat()
defer frame.Close()
http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "multipart/x-mixed-replace; boundary=frame")
for {
if ok := webcam.Read(&frame); !ok {
log.Println("Cannot read frame from webcam.")
break
}
if frame.Empty() {
continue
}
buf := new(bytes.Buffer)
img, err := frame.ToImage()
if err != nil {
log.Println("Failed to convert frame to image: ", err)
break
}
if err := jpeg.Encode(buf, img, nil); err != nil {
log.Println("Failed to encode frame: ", err)
break
}
_, err = fmt.Fprintf(w, "--frame\r\nContent-Type: image/jpeg\r\n\r\n")
if err != nil {
log.Println("Client disconnected.")
break
}
_, err = w.Write(buf.Bytes())
if err != nil {
log.Println("Failed to send frame: ", err)
break
}
}
})
fmt.Println("Server is running on port 9999")
log.Fatal(http.ListenAndServe(":9999", nil))
}
해당 서버를 구동한 후 stream 라우트에 접속해 보면 브라우저로 웹캠 스트림이 되고 있는 것을 확인할 수 있다.
728x90
'Golang' 카테고리의 다른 글
Golang에서 opencv 사용해보기 - gocv (0) | 2024.12.28 |
---|---|
Golang으로 백준 빠른 입출력 (0) | 2024.11.04 |
Golang으로 postgreSQL 연동 (0) | 2024.11.04 |