天天看点

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互相转化