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

猜你喜欢

转载自blog.csdn.net/raoxiaoya/article/details/131472425