代码:
# -*- coding: UTF-8 -*-
import cv2
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import numpy
def show_chinese(img,pos):
img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
font = ImageFont.truetype(font='/usr/share/fonts/DENG.TTF', size=24)
#font = ImageFont.load_default()
draw = ImageDraw.Draw(img_pil)
draw.text(pos,u"你好",fill=(255, 0, 0), font=font)
img_cv = numpy.asarray(img_pil)
#img_pil.show()
img = cv2.cvtColor(img_cv, cv2.COLOR_RGB2BGR)
return img
def usb_pipeline(device_name="/dev/video0",width=640,height=480,fps=30):
gst_str = ('v4l2src device={} ! '
'video/x-raw,'
'width=(int){},height=(int){},'
'format=(string)YUY2,framerate=(fraction){}/1 ! '
'videoconvert ! '
'video/x-raw,format=BGR ! '
'appsink').format(device_name,width,height,fps)
return gst_str
width = 640
height = 480
fps =30
device_name = "/dev/video0"
camera_path = usb_pipeline()
cap = cv2.VideoCapture(camera_path,cv2.CAP_GSTREAMER)
fps = cap.get(cv2.CAP_PROP_FPS)
while(True):
ret,frame = cap.read()
print("fps:",fps)
pos=(0,0)
frame=show_chinese(frame,pos)
cv2.imshow('frame',frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
注意点:
1.头部需要添加# -*- coding: UTF-8 -*-
这样编译的时候才能使用UTF-8识别编码,否则会出现识别不了中文部分字符的错误。
2.使用PIL下的模块对图片进行读取,重写,和字体的获取。需要import其下的模块。
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
- 字体这里,没有用绝对路径但是把字体放在/usr/share/fonts下似乎也能找到,应该是系统的默认路径。
- 使用PIL写入中文字体,要注意写入的字符前面要添加u””。在网上看到有些人直接写也可以,但是我这里不行,必须要添加u””才能显示中文,否则乱码。
- PIL图片和cv2图片的存储格式不同所以需要互相转换。
PIL是RGB格式,Image.open()返回的是Image对象。
cv2是BGR格式,cv2.imread返回的是numpy.nparray对象。
因此在转换时需要使用cv2.COLOR_RBG2BGR和cv2.COLOR_BGR2RGB转换。(总的是cv2.cvtColor(img,cv2.COLOR_BGR2RGB/RGB2BGR))
cv2转换为PIL用Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
PIL转换为cv2用numpy.asarray(cv2.cvtColor(img,cv2.COLOR_RGB2BGR))