天天看點

gocv.Mat類型和image.Image互相轉化

文章目錄

      • 1. image.Image轉gocv.Mat
      • 2. gocv.Mat轉image.Image

1. image.Image轉gocv.Mat

func cvtImageToMat(img image.Image) (gocv.Mat, error) {
	bounds := img.Bounds()
	x := bounds.Dx()
	y := bounds.Dy()
	bytes := make([]byte, 0, x*y*3)

	for j := bounds.Min.Y; j < bounds.Max.Y; j++ {
		for i := bounds.Min.X; i < bounds.Max.X; i++ {
			r, g, b, _ := img.At(i, j).RGBA()
			bytes = append(bytes, byte(b>>8), byte(g>>8), byte(r>>8))
		}
	}
	return gocv.NewMatFromBytes(y, x, gocv.MatTypeCV8UC3, bytes)
}
           

2. gocv.Mat轉image.Image

/*
	Parameters:
		mat: gocv.Mat,原圖像
		format: string,要轉換的類型格式,比如.png .jpeg
	Returns:
		img: image.Image 轉換之後的圖像
		err: error
*/
func cvtMatToImage(mat gocv.Mat, format string) (img image.Image, err error) {
	// 把mat轉成位元組,指定圖檔格式format
	buf, err := gocv.IMEncode(gocv.FileExt(format), mat)
	if err != nil {
		return nil, err
	}
	// 根據圖檔的位元組,建立出reader
	reader := bytes.NewReader(buf)
	// 解碼,将位元組解碼成圖檔
	dest, _, err := image.Decode(reader)
	if err != nil {
		return nil, err
	}
	return dest, err
}
           

調用:

func main() {
	src := gocv.IMRead("Blue.jpg", gocv.IMReadColor)
	if src.Empty() {
		log.Println("failed to load image")
		return
	}
	img, err := cvtMatToImage(src, ".jpeg")
	if err != nil {
		log.Println(err)
		return
	}
}
           

後來才發現,,,gocv.Mat轉image.Image有直接調用

ToImage()

方法就可以了,:

gocv.Mat類型和image.Image互相轉化