读取GIF图像
opencv中无法读取gif图像,这是由于license原因。转而使用 videocapture 或者第三方的 PIL 库(Python),但是其实Golang的基础库image
中就有读取gif图像的。于是一个简单的示例如下
func ReadAndShowGIF(filename string) {
w := gocv.NewWindow(filename)
f, _ := os.Open(filename)
defer f.Close()
gi, _ := gif.DecodeAll(f)
for k, v := range gi.Image {
img, err := gocv.ImageToMatRGB(v)
if err != nil {
log.Fatal(err)
}
w.IMShow(img)
w.WaitKey(gi.Delay[k] * 10) // delay 单位是百分之一秒,waitkey参数为毫秒
}
w.WaitKey(0)
}
这里只会播放一遍gif图像,我们还可以解析gif中的LoopCount来增加循环播放的逻辑。
读取mp4视频文件
首先要确保cmake安装的时候成功安装了opencv_ffmpeg_64.dll and opencv_ffmpeg.dll
依赖,否则在调用gocv.VideoCaptureFile
或者gocv.OpenVideoCapture
的时候会报错Error opening file: showimage/video1.mp4
。
打开opencv编译安装的路径下C:\opencv\build\lib
,的确没找到这两依赖,那怎么办呢?
opencv在编译的时候会首先查找当前系统有没有安装ffmpeg,如果没有安装才会去下载安装,但是可能是在下载的时候失败了,所以就没有安装这个依赖,下载失败的日志可以在opencv/build/CMakeDownloadLog.txt
找到,因此,我们打开梯子软件,然后重新编译opencv。
读取视频文件使用gocv.VideoCaptureFile(filename)
或者gocv.OpenVideoCapture(filename)
,然后逐帧处理
func ReadAndShowVideo(filename string) {
w := gocv.NewWindow(filename)
vc, err := gocv.VideoCaptureFile(filename)
if err != nil {
fmt.Println(err)
return
}
mat := gocv.NewMat()
for {
if vc.Read(&mat) {
w.IMShow(mat)
w.WaitKey(10)
} else {
break
}
}
w.WaitKey(0)
}
其实也可以使用ReadAndShowVideo
函数来读取GIF图像,但是不如ReadAndShowGIF
控制的更细致。