解决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一并解决了~_~
分类:
Go语言(golang)
标签:
golang gocv
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2014-06-27 安装vmware vCenter Appliance