解決cv2.putText()函數不能在圖片或視頻流上打印中文

首先在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的學習還需努力,現在做個筆記加深一下印象!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章