首先在linux系統下面安裝配置字體文件
先到win10下面的windows/fonts/目錄下將需要的字體文件拷貝出來;然後到linux系統下執行以下命令:
sudo mkdir /usr/share/fonts/win10 #在Ubuntu 系統目錄/usr/share/fonts 下創建一個名爲win10的目錄,存放我們將要安裝的字體文件
sudo cp /home/liuxiang/fonts/* /usr/share/fonts/win10 #將/home/liuxiang/fonts/下存放的字體文件複製到/usr/share/fonts/win10目錄中
cd /usr/share/fonts/win10 #進入創建的字體目錄
sudo mkfontscale #創建字體的fonts.scale文件,它用來控制字體旋轉縮放
sudo mkfontdir #創建字體的fonts.dir文件,它用來控制字體粗斜體產生
sudo fc-cache -f -v #建立字體緩存信息也就是讓系統認識安裝字體
近期在做人臉識別小項目,最後將識別的結果顯示在圖片或者視頻上時,出現亂碼;以這篇博客來做一個學習筆記。
經過查閱資料才知道cv2.putText()這個函數只能輸出英文,對中文輸出會出現亂碼,上網找了好多教程,都只有在圖片上打印中文的,最後才知道在視頻中打印中文也是同樣的方式。在上代碼之前還是先介紹一下cv2.putText()這個函數,直接上代碼吧。
cv2.putText(img, str(i), (123,456), font, 2, (0,255,0), 3)
上面參數解釋(圖片,需要打印的文本,打印的位置座標,字體,字體大小,顏色,字體粗細)
opencv在視頻中通過putText函數能添加文字,但對於中文則會出現亂碼。
需要打印中文的話,還需要將圖片格式先轉換一下,使用PIL在圖片上繪製添加中文,可以指定字體文件。
現將在圖片+視頻中打印中文封裝成一個函數,進行整體的調用:
import cv2
from PIL import Image,ImageDraw,ImageFont
import numpy as np
#封裝函數
def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
if (isinstance(img, np.ndarray)): # 判斷是否OpenCV圖片類型
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 創建一個可以在給定圖像上繪圖的對象
draw = ImageDraw.Draw(img)
# 字體的格式
fontStyle = ImageFont.truetype(
"simsun.ttc", textSize, encoding="utf-8")
# 繪製文本
draw.text(position, text, textColor, font=fontStyle)
# 轉換回OpenCV格式
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
#在圖片中打印中文
img = cv2.imread('C:\\Users\\liuxiang\\Desktop\\tupian\\huge.jpg')
img = cv2AddChineseText(img,'胡歌',(100,100),(255, 0 , 0), 30)
cv2.imshow('img',img)
cv2.waitKey(0)
#在視頻中打印中文
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret,frame = cap.read()
frame = cv2AddChineseText(frame,'視頻中打印中文',(100,100),(255, 0 , 0), 30)
cv2.imshow('real_time',frame)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
用了一張胡歌的照片做了一個簡單測試:
緊接着是在視頻上打印中文的測試:將自己的攝像頭簡單的對準自己屏幕做了一個截圖。
總結
視頻中打印中文,使用frame=cv2ImgAddText(frame,)來調用函數,不要使用的img=cv2ImgAddText(frame,)來調用函數,因爲視頻傳入的是一幀一幀的圖像。我之前就這樣調用,結果一直失敗,對opencv的學習還需努力,現在做個筆記加深一下印象!