在go语言中实现把网络摄像机的图像帧保存到视频文件中代码示例
Go  /  管理员 发布于 1年前   434
在go语言中你如何保存网络摄像机拍摄的图像帧,并将这些图像存储到视频文件中?
下面的代码是一个简单的命令行程序,它将用Go-OpenCV激活网络摄像机,一次抓取一个图像帧,在一个for循环中连续将图像存储到视频文件中。
这个循环只有在按下ESC键后才会中断。
要构建下面的代码,首先要安装OpenCV库。
在MacOSX上,使用homebrew来:
>brew install homebrew/science/opencv
并安装go-opencv扩展包
go get github.com/lazywei/go-opencv
构建代码并以目标文件名执行它。
示例代码:
saveWebCam2File.go
package main
/*
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
char getch(){
char ch = 0;
struct termios old = {0};
fflush(stdout);
if( tcgetattr(0, &old) < 0 ) perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if( tcsetattr(0, TCSANOW, &old) < 0 ) perror("tcsetattr ICANON");
if( read(0, &ch,1) < 0 ) perror("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if(tcsetattr(0, TCSADRAIN, &old) < 0) perror("tcsetattr ~ICANON");
return ch;
}
*/
import "C"
// stackoverflow.com/questions/14094190/golang-function-similar-to-getchar
import (
"fmt"
"github.com/lazywei/go-opencv/opencv"
"math/rand"
"os"
"time"
)
func main() {
if len(os.Args) != 2 {
fmt.Printf("Usage : %s <save to filename>\n", os.Args[0])
os.Exit(0)
}
videoFileName := os.Args[1]
//激活网络摄像机
webCamera := opencv.NewCameraCapture(opencv.CV_CAP_ANY) //自动检测
if webCamera == nil {
panic("无法打开摄像机")
}
// !! 在选择编解码器之前,需要检查你的操作系统是否安装了编解码器!
// !! 否则,你将得到一个非常小和损坏的视频文件!!
// 其他可能的组合见http://www.fourcc.org/codecs.php
// opencv.FOURCC('p', 'i', 'm', '1') // MPEG-1 codec
// opencv.FOURCC('m', 'j', 'p', 'g') // motion-jpeg codec
// opencv.FOURCC('m', 'p', '4', '2') // MPEG-4.2 codec
// opencv.FOURCC('d', 'i', 'v', '3') // MPEG-4.3 codec
// opencv.FOURCC('m', 'p', '4', 'v') // MPEG-4 codec
// opencv.FOURCC('u', '2', '6', '3') // H263 codec
// opencv.FOURCC('i', '2', '6', '3') // H263I codec
// opencv.FOURCC('f', 'l', 'v', '1') // FLV1 codec
// codec := opencv.CV_FOURCC_PROMPT // 仅限Windows。提示选择编解码器
// codec := int(webCamera.GetProperty(opencv.CV_CAP_PROP_FOURCC)) // 在我的Mac上无法工作
codec := int(opencv.FOURCC('m', 'p', '4', 'v')) //必须是小写,大写会把文件搞坏...
fps := float32(30) //每秒30帧
//fps := float32(webCamera.GetProperty(opencv.CV_CAP_PROP_POS_FRAMES))
frameWidth := int(webCamera.GetProperty(opencv.CV_CAP_PROP_FRAME_WIDTH))
frameHeight := int(webCamera.GetProperty(opencv.CV_CAP_PROP_FRAME_HEIGHT))
isColor := 1 // 0 = false(grayscale), 1 = true -- 只适用于Windows
// !! 重要的是: 记得将输入(src)和输出(destination)的类型设为frameWidth和frameHeight。
// 输入(src)和输出(destination)的类型都是一样的。
// 否则,你会得到这样的错误信息----。
// [OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor,] 。
// 只是注意,如果你想的话,你仍然可以在写入文件之前调整帧的大小。
// 想了解更多信息,请阅读http://docs.opencv.org/trunk/dd/d9e/classcv_1_1VideoWriter.html
videoFileWriter := opencv.NewVideoWriter(videoFileName, codec, fps, frameWidth, frameHeight, isColor)
//不加评论,看你自己的录音
// win := opencv.NewWindow("Go-OpenCV记录网络摄像头到文件")
fmt.Println("按ESC键退出")
//继续执行拦截ESC键的命令
//因为opencv.WaitKey在我的Mac上不起作用 :(
go func() {
key := C.getch()
fmt.Println()
fmt.Println("清理 ...")
if key == 27 {
//videoFileWriter.Release() -- optional
webCamera.Release()
//win.Destroy() -- 不加评论,看你自己的录音
fmt.Println("Play", videoFileName, "用一个视频播放器来看看结果。该视频没有音频!")
os.Exit(0)
}
}()
// 录制过程中的勾选。来自老DOS时代。
ticker := []string{
"-",
"\\",
"/",
"|",
}
rand.Seed(time.Now().UnixNano())
for {
if webCamera.GrabFrame() {
imgFrame := webCamera.RetrieveFrame(1)
if imgFrame != nil {
//win.ShowImage(imgFrame) -- 不加评论,看你自己的录音
//保存帧到视频
frameNum := videoFileWriter.WriteFrame(imgFrame)
if frameNum > 0 {
fmt.Printf("\r录音现在已经开始了。向你的网络摄像机挥手吧! [%v]", ticker[rand.Intn(len(ticker)-1)])
}
//if opencv.WaitKey(1) >= 0 { -- 在Mac上无法工作! :(
// os.Exit(0)
//}
}
}
}
}
输出:
>./saveWebCam2File test.mp4
按ESC键退出
现在录制。向你的网络摄像机挥手致意! [/]
清理 ...
清理了摄像头。
播放测试.mp4,看看结果。
注意:这视频文件是没有音频的
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号