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 結束啦 小夥伴們自己嘗試一下吧