解决GoCV/OpenCV不支持中文的问题

一、imread 不支持中文路径名,如果图片文件路径名中有中文,就会报错

 imread_('W:\GZGTOOL\Images\壁纸\迪士尼乐园\s04.jpg'): can't open/read file: check file path/integrity

解决办法

很简单,参考python中的思路,自己把图片文件读出来,然后再用imdecode

 func LoadImage(fp string)(cv.Mat,error){  
   img:=cv.NewMat()
   buf,err:=ioutil.ReadFile(fp)
   if err!=nil{
     return img, err
   }
   err =cv.IMDecodeIntoMat(buf,cv.IMReadAnyColor,&img) 
   return img,err
 }

二、puttext不支持中文,用opcv内置方法puttext写字符串到图片上,如果包含中文,只能得到一串”???“

 cv.PutText(&img,fmt.Sprintf("image%d图片%d",i,i),image.Pt(200,200),cv.FontHersheyComplex,2,color.RGBA{255,0,0,0xff},2)

结果如下:

 

解决办法

1,据说opencv5.0中已经支持中文了,期待5.0发布和gocv同步升级

2,使用freetype,参考了大佬这篇文章

 func  WriteTextOnMat(mat *cv.Mat, text string,textPos image.Point, textSize float64, textColor color.RGBA,fontFile string)error{
   img,err:=mat.ToImage()
   if err!=nil{
     return err
   }
   img,err=WriteTextOnImage(img,text,textPos,textSize,textColor,fontFile)
   if err!=nil{
     return err
   }   
   mat2,err:=CvtImageToMat(img)
   if err!=nil{
     return err
   } 
   mat2.CopyTo(mat)
   mat2.Close()
   return nil
 }
 //Image2RGBA Image2RGBA
 func Image2RGBA(img image.Image) *image.RGBA {
   if rgba,ok:=img.(*image.RGBA);ok{
     return rgba
   }
   baseSrcBounds := img.Bounds().Max
   w,h := baseSrcBounds.X, baseSrcBounds.Y
   dst := image.NewRGBA(image.Rect(0, 0, w, h)) 
   //copy图片
   draw.Draw(dst, dst.Bounds(), img, img.Bounds().Min, draw.Over)
 return dst
 }
 func  WriteTextOnImage(img image.Image, text string,textPos image.Point, textSize float64, textColor color.RGBA,fontFile string)(image.Image,error){
   // Read the font data.
   dpi:=72.0
   fontBytes, err := ioutil.ReadFile(fontFile)
   if err != nil {
     fmt.Println(err)
     return img,err
   }
   ft, err := freetype.ParseFont(fontBytes)
   if err != nil {
     fmt.Println(err)
     return img,err
   }
 // Initialize the context.
   fontColor:=image.NewUniform(textColor)
   rgbaImg:=Image2RGBA(img)
   c := freetype.NewContext()
   c.SetDPI(dpi)
   c.SetFont(ft)
   c.SetFontSize(textSize)
   c.SetClip(img.Bounds())
   c.SetDst(rgbaImg)
   c.SetSrc(fontColor)
       
   // Draw the text.
   pt := freetype.Pt(textPos.X, textPos.Y + int(c.PointToFixed(textSize)>>6))
   
   _, err = c.DrawString(text, pt)
   if err != nil {
     fmt.Println(err)
     return img, err
   }
   return rgbaImg, nil 
 }

 

调用方法

 WriteTextOnMat(&img,"图片2",image.Pt(100,100),120,color.RGBA{255,0,0,0xff},"c:\\windows\\fonts\\msyh.ttc")
 

三、窗口标题不能显示中文

这个暂时没有找到办法解决,只能期待opencv 5.0一并解决了~_~

 

posted @ 2023-06-27 09:40  柒零壹  阅读(135)  评论(0编辑  收藏  举报