gocv實現字符畫視頻

gocv實現字符畫視頻

1、gocv官網gocv Gayhub

其實就是opencv golang版本,熟悉opencv的小夥伴很容易上手滴

2、讓我們開始吧QwQ

1、獲取視頻的每一幀並保存到img[]裏

// video_addr 爲視頻的路徑(建議絕對路徑)
// img gocv.Mat的數組類型 即將要保存的每一幀圖片的集合
// point 爲image.Point類型 我們在對圖片進行resize的時候需要用到(將size減小來縮短程序運行時間)
func video2imgs(video_addr string, imgs *([]gocv.Mat), point image.Point) {
    // 讀取視頻並返回VideoCapture
    ocp, _ := gocv.OpenVideoCapture(video_addr)
    img := gocv.NewMat()
    //通過for循環讀取視頻每一幀
    for {
        //如果VideoCapture還能讀取到img
        if ocp.Read(&img) {
            img2 := gocv.NewMat()
            // 將彩色視頻幀轉成灰度圖
            gocv.CvtColor(img, &img2, gocv.ColorBGRToGray)
            // resize圖片
            gocv.Resize(img2, &img2, point, 0, 0, gocv.InterpolationLinear)
            // 將圖片加入圖片集
            *imgs = append(*imgs, img2)
        } else {
            break
        }
    }
    defer ocp.Close()
    return
}

2、將圖片轉化爲字符畫

// 傳入圖片 返回二維數組用於展示
func img2char(img gocv.Mat) [][]string {
    // 用於展示的字符 從不明顯到明顯
	pixels := ` .,-'` + `:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$`
	// 圖片歸一化(歸pixels的長度tvt)
	img.DivideFloat(255 / float32(len(pixels)-1))
	cols, rows := img.Cols(), img.Rows()
	img_string := make([][]string, 0)
	for i := 0; i < rows; i++ {
		row_string := make([]string, 0)
		for j := 0; j < cols; j++ {
		    // 將圖片的每一個point轉化成字符
			row_string = append(row_string, string(pixels[img.GetSCharAt(i, j)]))
		}
		img_string = append(img_string, row_string)
	}
	return img_string
}

3、顯示和清屏每一個字符畫

// 對圖片的每一幀顯示加一個間隔 並調用terminal的清屏函數"clear"
// 如果是別的終端可以參考https://studygolang.com/articles/15848
func SleepAndClear()  {
	// 延時
	time.Sleep(20*time.Millisecond)
	// 清屏
	c := exec.Command("bash","-c","clear")
	c.Stdout = os.Stdout
	c.Run()
}

4、主函數

func main() {
	point := image.Point{X: 120, Y: 60}
	imgs := make([]gocv.Mat, 0)
	video2imgs("./badapple.mp4", &imgs, point)
	vedio2string := make([][][]string,0)
	for _,v := range imgs{
		vedio2string = append(vedio2string, img2char(v))
	}
	for z:=0;z<len(vedio2string) ;z++  {
		for i:=0;i<point.Y ;i++  {
			for j:=0;j<point.X ;j++  {
				fmt.Print(vedio2string[z][i][j])
			}
			fmt.Println()
		}
		SleepAndClear()
	}
}

okk 結束啦 小夥伴們自己嘗試一下吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章