gocv读取gif多帧图像,mp4视频图像,opencv,VideoCaptureFile,opencv_ffmpeg

读取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控制的更细致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值