文章目录
-
-
- 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()
方法就可以了,:
