Opencvpython(1)基本介绍和3种中文文字输出探讨
1 Opencv:
========
1.1 OpenCV是计算机视觉领域应用最广泛的开源工具包,基于C/C++,跨平台的。
1.2 OpenCV最早源于Intel公司1998年的一个研究项目。
1.3 OpenCV旨在提供一个用于计算机视觉的科研和商业应用的高性能通用库。
1.4 并提供了Python,Matlab和Java等语言的接口。
2 Opencv-python:
==============
2.1 OpenCV的python的API接口。
2.2 OpenCV也有两个大版本:OpenCV2和OpenCV3。
2.3 作用:图像image、视频video、机器学习等方面有强大作用。
2.4 只讲Python下OpenCV安装和cv2基本使用,简单入门,防止掉坑。
3 准备:
=====
3.1 官网:https://opencv.org/ #官网 https://github.com/opencv/opencv #github https://opencv-python-tutroals.readthedocs.io/en/latest/index.html #文档
3.2 环境:
华为笔记本电脑、深度deepin-linux操作系统、谷歌浏览器、python3.8和微软vscode编辑器。
3.3 安装:pip install --upgrade setuptools #升级pip pip install numpy Matplotlib #提前安装依赖 pip install opencv-python #这才是安装 #本机安装: sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple opencv-python
4 读取并显示图片:
=============
4.1 代码1:#导入模块,注意是cv2,不是opencv import cv2 #读取图片 img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") #打印图片类型 print(type(img)) #显示图片,窗口标题名 cv2.imshow("pic1", img) #不支持中文 cv2.waitKey(0)
4.2 图:
4.3 窗口大小、位置设置代码:import cv2 #读取图片 img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") cv2.namedWindow("pic1",0) #窗口大小和可调节窗口设置 cv2.resizeWindow("pic1", 640, 480) #x和y,窗口的坐标位置,左上角坐标为0,0 cv2.moveWindow("pic1",200,200) #显示图片 cv2.imshow("pic1",img) cv2.waitKey(0)
4.4 默认窗口大小和位置,设置窗口大小可调节的代码:import cv2 #读取图片 img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") #默认窗口大小(估计199和188)和位置(右下角),但是窗口可调节大小 #cv2.namedWindow("pic1",cv2.WINDOW_NORMAL) cv2.namedWindow("pic1",cv2.WINDOW_GUI_NORMAL) #显示图片 cv2.imshow("pic1",img) cv2.waitKey(0)
4.5 图:
5 显示中文问题:
============
5.1 窗口标题名中文显示问题:
5.1.1 代码:import cv2 # cv2读取图片 img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") # 名称不能有汉字 cv2.imshow("pic图片", img) # 汉字窗口标题显示乱码 cv2.waitKey (0) #0代表永远 #cv2.waitKey (10000) # 显示 10000 ms 即 10s 后消失 cv2.destroyAllWindows()
5.1.2 图:
标题名:乱码,也不知道是什么码?
5.1.3 查资料发现,网上的方法暂时不适合本机,原因是本机系统默认图片编辑器ImageMagick,显示图片:cv2.imshow("pic图", img) #不支持中文显示 #此处暂时不介绍,以后专门写一个图片编辑器ImageMagick的入门,专门将标题名的中文设置
5.1.4 先用matplotlib来显示,代码:import cv2 import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.canvas.set_window_title("pic图") #这里的中文设置不说了,有三种方法 #img是一个numpy.ndarray对象,默认是以BGR三通道读取图片数据(三维数组) img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") # 切片 b,g,r = cv2.split(img) #通道拆分 # 合并,恢复原图 img2 = cv2.merge([r,g,b]) #通道从新按rgb顺序合并 plt.imshow(img2) #恢复原色 plt.show()
5.1.5 图:
OK,搞定!
5.2 图片内嵌入中文字:(3种方法)
===========================
5.2.1 方法一:联合PIL法,代码:from PIL import Image, ImageDraw, ImageFont import cv2 import numpy as np # cv2读取图片,名称不能有汉字 img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") # cv2和PIL中颜色的hex码的储存顺序不同 cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pilimg = Image.fromarray(cv2img) # PIL图片上打印汉字 draw = ImageDraw.Draw(pilimg) # 图片上打印 #提前下载中文字体华文仿宋hwfs.ttf,大小和编码 font = ImageFont.truetype("hwfs.ttf", 40, encoding="utf-8") #位置,文字,颜色==红色,字体引入 draw.text((20, 20), "天高气爽", (255, 0, 0), font=font) # PIL图片转cv2 图片 cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR) cv2.imshow("PIL显示中文", cv2charimg) # 汉字窗口标题显示乱码,下次再说 cv2.waitKey (0) cv2.destroyAllWindows()
5.2.2 图:
5.2.3 方法二 matplotlib法,代码:import matplotlib.pyplot as plt import cv2 #读取 img=cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转化为RGB a,b=img.shape[:2] #取宽和高 #fig=plt.figure(figsize=(b/100,a/100))#根据图片大小设置画布的大小,很关键 #ax=fig.add_subplot(111) #等同上面 fig, ax = plt.subplots(figsize=(b/100,a/100)) #显示 ax.imshow(img) #fig.imshow(img) #不能显示 #清除坐标轴刻度 ax.set_yticks([]) ax.set_xticks([]) #图片中的文字的位置,文字内容,字体颜色,大小设置 #注意位置40,80是x和y坐标,是fig的坐标,不是ax的坐标 ax.text(40,80,"天高气爽",color="red",size=40) plt.show()
5.2.4 图:
5.2.5 方法三:freetype,代码:#参考文章: #https://blog.csdn.net/wyx100/article/details/75579581 #-*- coding: utf-8 -*- import cv2 #FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎 #pip install freetype-py #推荐安装 #sudo pip3.8 install freetype-py #本机安装 import copy import freetype img = cv2.imread("/home/xgj/Desktop/opencv-cv2/pic1.jpeg") text_cn = "秋高气爽freetype" #字体颜色、位置和大小定义 color = (0, 255, 0) # Green pos = (20, 20) text_size = 40 #可以封装函数:输入中文文字 class put_chinese_text(object): def __init__(self, ttf): self._face = freetype.Face(ttf) def draw_text(self, image, pos, text, text_size, text_color): self._face.set_char_size(text_size * 64) metrics = self._face.size ascender = metrics.ascender / 64.0 ypos = int(ascender) text = text img = self.draw_string(image, pos[0], pos[1] + ypos, text, text_color) return img def draw_string(self, img, x_pos, y_pos, text, color): prev_char = 0 pen = freetype.Vector() pen.x = x_pos << 6 # p 64 pen.y = y_pos << 6 hscale = 1.0 matrix = freetype.Matrix(int(hscale) * 0x10000, int(0.2 * 0x10000), int(0.0 * 0x10000), int(1.1 * 0x10000)) cur_pen = freetype.Vector() pen_translate = freetype.Vector() image = copy.deepcopy(img) for cur_char in text: self._face.set_transform(matrix, pen_translate) self._face.load_char(cur_char) kerning = self._face.get_kerning(prev_char, cur_char) pen.x += kerning.x slot = self._face.glyph bitmap = slot.bitmap cur_pen.x = pen.x cur_pen.y = pen.y - slot.bitmap_top * 64 self.draw_ft_bitmap(image, bitmap, cur_pen, color) pen.x += slot.advance.x prev_char = cur_char return image def draw_ft_bitmap(self, img, bitmap, pen, color): x_pos = pen.x >> 6 y_pos = pen.y >> 6 cols = bitmap.width rows = bitmap.rows glyph_pixels = bitmap.buffer for row in range(rows): for col in range(cols): if glyph_pixels[row * cols + col] != 0: try: img[y_pos + row][x_pos + col][0] = color[0] img[y_pos + row][x_pos + col][1] = color[1] img[y_pos + row][x_pos + col][2] = color[2] except: continue #调用函数,引出中文字体hwfs,在根目录下 ft = put_chinese_text("hwfs.ttf") #在图片上写中文字 image = ft.draw_text(img, pos, text_cn, text_size, color) #显示图片,标题名 cv2.imshow("freetype", image) cv2.waitKey(0)
5.2.6 图:
6 备注:
这么强大的库,中文设置还是有点麻烦,所以最好用英文。
当然,在以后介绍人脸识别显示中文姓名时还是需要用到。
也衷心希望下一个版本的opencv能更好的兼容中文。
===自己整理并分享出来===
喜欢的人,请点赞、关注、评论、转发和收藏。