OpenCV中读取中文路径、窗口命名中文、图片加中文乱码问题汇总
精选文章,第一时间送达
#1.解决opencv读取中文路径报错的问题
file_path1 = "D:\Project\Monet_traffic\图片\哈儿.jpg"
image = cv2.imread(filename=file_path1)
print(Image.shape[0]) # 报错
cv2.imshow("1",image) #报错
file_path1 = "D:\Project\Monet_traffic\图片\哈儿.jpg"
image = cv2.imread(filename=file_path1)
# # print(Image.shape[0]) # 报错
# cv2.imshow("1",image) #报错
#读取图像,解决imread不能读取中文路径路径的问题
def cv_imread(file_path):
#imdedcode读取的是RGB图像
cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)
return cv_img
image = cv_imread(file_path1)
print("图像的高度:",image.shape[0],"图像的宽度:",image.shape[1])
cv2.imshow("image", image)
#2.输出中文文件,解决输出中文文件乱码的问题
# image1为图片对象,filepath为输出图片路径
"D:\Project\Monet_traffic\图片\苏菲.png" file_path2 =
#执行成功,但是图片未保存成功到本地 cv2.imwrite(filename=file_path2,img=image)
'.png', image)[1].tofile(file_path2) #执行保存成功 cv2.imencode(
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者数字0
# cv2.resizeWindow("window", 480, 320) #设置图片显示窗口大小
# 读入图片
image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"
image = cv2.imread(image_path)
print(image.shape) # 图片大小
print(type(image))
# 改变图片大小,fx代表对图片的长进行缩放尺寸系数
# image = cv2.resize(image,None,fx=0.5,fy=0.5)
# 显示图片:窗口名,显示图片
# cv2.imshow(‘窗口标题’,image),如果前面没有cv2.namedWindow,自动先执行一个cv2.namedWindow()
cv2.imshow(winname='image', mat=image)
#读入图片
image = cv2.imread(r"D:\Project\Monet_traffic\data\photo\3.jpg")
#编码格式转换
def zh_ch(string):
return string.encode("gbk").decode('UTF-8', errors='ignore')
cv2.namedWindow(winname=zh_ch('图片'))
cv2.imshow(zh_ch('图片'), image)
cv2.waitKey(0)
从根本上解决这一问题,目前有两种方案:
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者数字0
# cv2.resizeWindow("window", 480, 320) #设置图片显示窗口大小
# 读入图片
image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"
image = cv2.imread(image_path)
print(image.shape) # 图片大小
print(type(image))
# 改变图片大小,fx代表对图片的长进行缩放尺寸系数
# image = cv2.resize(image,None,fx=0.5,fy=0.5)
# 显示图片:窗口名,显示图片
# cv2.imshow(‘窗口标题’,image),如果前面没有cv2.namedWindow,自动先执行一个cv2.namedWindow()
cv2.imshow(winname='image', mat=image)
# 图片上画框
cv2.rectangle(img=image, pt1=(285, 40), pt2=(350, 120), color=(0, 255, 0), thickness=2)
# 图片上添加文字
cv2.putText(img=image,text="哈儿", org=(275 , 60), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=2.5, color=(0, 0, 255), thickness =2)
cv2.imshow(winname='image', mat=image
解决办法:Python中将OpenCV格式的numpy.ndarray图片,转换成PIL格式的'PIL.Image.Image图片,使用PIL的图片绘制中文,PIL格式的图片可以指定字体文件,也就是说可以使用PIL实现中文的输出。
OpenCV图片格式转换成PIL的图片格式
使用PIL的ImageDraw.Draw.text绘制添加文字
将添加完文字的PIL格式图片转换为OpenCV格式图片进行展示
cv2.namedWindow(winname="image", flags=cv2.WINDOW_AUTOSIZE) # 或者数字0
# cv2.resizeWindow("window", 480, 320) #设置图片显示窗口大小
# 读入图片
image_path = r"D:\Project\Monet_traffic\data\photo\3.jpg"
image = cv2.imread(image_path)
print(image.shape) # 图片大小
print(type(image))
# 改变图片大小,fx代表对图片的长进行缩放尺寸系数
# image = cv2.resize(image,None,fx=0.5,fy=0.5)
# 显示图片:窗口名,显示图片
# cv2.imshow(‘窗口标题’,image),如果前面没有cv2.namedWindow,自动先执行一个cv2.namedWindow()
cv2.imshow(winname='image', mat=image)
# 图片上画框
cv2.rectangle(img=image, pt1=(285, 40), pt2=(350, 120), color=(0, 255, 0), thickness=2)
# 添加中文
# 转换为PIL的image图片格式,使用PIL绘制文字,再转换为OpenCV的图片格式
def image_add_text(img1, text, left, top, text_color, text_size):
# 判断图片是否为ndarray格式,转为成PIL的格式的RGB图片
if isinstance(img1, np.ndarray):
image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
print(type(image))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(image)
# 参数依次为 字体、字体大小、编码
font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')
# 参数依次为位置、文本、颜色、字体
draw.text((left, top), text, text_color, font=font_style)
return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
image = image_add_text(image, "哈儿", 225, 50, (255, 0, 0), 40)
cv2.imshow(winname='image', mat=image)
# 转换为PIL的image图片格式,使用PIL绘制文字,再转换为OpenCV的图片格式
def image_add_text(img1, text, left, top, text_color, text_size):
# 判断图片是否为ndarray格式,转为成PIL的格式的RGB图片
if isinstance(img1, np.ndarray):
image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
print(type(image))
# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(image)
# 参数依次为 字体、字体大小、编码
font_style = ImageFont.truetype("font/simsun.ttc", text_size, encoding='utf-8')
# 参数依次为位置、文本、颜色、字体
draw.text((left, top), text, text_color, font=font_style)
return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
video_path = r'D:\Project\Monet_traffic\data\video\test.mp4'
capture = cv2.VideoCapture(video_path)
# 判断VideoCaputre对象是否成功打开
if capture.isOpened():
print('已经打开了视频文件')
while (True):
fps = capture.get(cv2.CAP_PROP_FPS) # 返回视频的fps--帧率
width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 返回视频的宽
height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 返回视频的高
print('fps:', fps, 'width:', width, 'height:', height)
# 检测图片的起始时间
t1 = time.time()
# 读取某一帧
ret, frame = capture.read() # 如果正确读取帧,ret为True,否则ret为false
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
else:
frame = image_add_text(frame, "哈儿", 225, 50, (255, 0, 0), 40)
# 检测图片的结束时间
t2 = time.time()
fps = (fps + (1. / (t2 - t1))) / 2
cv2.putText(img=frame, text=str(fps), org=(275, 60), fontFace=cv2.FONT_HERSHEY_PLAIN,fontScale=1.5, color=(0, 0, 255),thickness=2)
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xff == ord('q'): # waitKey(0):
break
# 释放对象
capture.release()
cv2.destroyAllWindows()
else:
print('视频文件打开失败')
PS2: 推荐一个RGB和字体下载的网站
RGB 对应的颜色可以使用 https://www.sioe.cn/yingyong/yanse-rgb-16/进行查看。
字体下载可以使用http://www.font5.com.cn/font_download.php?id=150&part=1237886897下载使用。
完整论文以及代码下载,后台回复关键字:OpenCV,即可获取数据集和源代码。
评论