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