【杂项】使用gocv库实现视频转终端字符画
381 字
2 分钟
【杂项】使用gocv库实现视频转终端字符画

package main
import ( "bytes" "fmt" "gocv.io/x/gocv" "golang.org/x/crypto/ssh/terminal" "image" "os" "os/exec" "time")
const pixels = ` .,-'` + `:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$`
func main() { // 打开文件 c, err := gocv.VideoCaptureFile("../1.mp4") // 获取帧数 fps := c.Get(gocv.VideoCaptureFPS) if err != nil { panic(err) }
mat := gocv.NewMat() w, h := 0, 0 // 放大缩小倍率 b := 0 // 每一帧之间时长 s := int64((1 / fps) * 1e6)
var t time.Time // 每一帧时长与每一帧计算时长之差 var sub int64
var buf bytes.Buffer // 转化大小 point := image.Point{Y: 0, X: 0} for c.Read(&mat) { t = time.Now() // 获取终端大小 wl, hl, _ := terminal.GetSize(int(os.Stdout.Fd())) // 如果终端大小发生变化则重新计算放大缩小倍率 if wl != w || hl != h { w = wl h = hl x, y := mat.Rows(), mat.Cols() if hl > wl { if x < wl { b = wl / x x *= b y *= b } else { b = x / wl x /= b y /= b } } else { if y < hl { b = hl / y x *= b y *= b } else { b = y / hl x /= b y /= b } } point.X = x point.Y = y } // 转灰度 gocv.CvtColor(mat, &mat, gocv.ColorBGRToGray) // resize图像大小 gocv.Resize(mat, &mat, point, 0, 0, gocv.InterpolationLinear) // 图像归一化 mat.DivideFloat(255 / float32(len(pixels)-1)) cols, rows := mat.Cols(), mat.Rows() buf.Reset() for i := 0; i < rows; i++ { for j := 0; j < cols; j++ {
// 图像转化字符 buf.WriteByte(pixels[mat.GetSCharAt(i, j)]) } buf.WriteByte('\n') } sub= time.Now().Sub(t).Microseconds() // 如果比较计算时间与每一帧图像时间 if sub < s { // 休眠,使字符显示时间靠近源视频每一帧时间 time.Sleep(time.Duration(s-sub) * time.Microsecond) } // 清屏 cmd := exec.Command("bash", "-c", "clear") cmd.Stdout = os.Stdout cmd.Run() fmt.Print(buf.String()) }}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
【Golang】使用gocv库编写三帧法
Golang笔记2021-08-04
2
【Golang】使用CGO交叉编译
Golang笔记2020-04-08
3
【Golang】实现文件服务器断点续传
Golang笔记2020-02-05
4
【Golang】调用syscall调用windows dll弹窗
Golang笔记2022-09-22
5
【Golang】1.18泛型初步理解
Golang笔记2022-04-18
随机文章随机推荐















加载更多…