系列所有代码,复制粘贴即可运行。
希望有能力的朋友还是拿C++运行一下,python对opencv再封装的时候,少了一些C库中的对象和方法。
本节讨论对颜色空间BGR,HSV等的转换,图像在opencv库中的数据结构,颜色三通道的合并分离,图形绘制和中英文文本绘制等
HSV也叫HSB,opencv用的最多,使用方便。
HSL在顶部是纯白的,色相H与HSV完全一致,但是S和L不一样,S与混入黑白颜色量,没有关系:
YUV考虑到人类感知能力 允许降低色度的带宽 占用极少的带宽 多用于电视中
import cv2
def callback(value):
pass
cv2.namedWindow('color', cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640, 480)
img = cv2.imread('cat.jpeg')
#常见颜色空间转换
colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
while True:
index = cv2.getTrackbarPos('curcolor','color')
#颜色空间转换API
cvt_img = cv2.cvtColor(img, colorspaces[index])
cv2.imshow('color', cvt_img)
key = cv2.waitKey(10)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()
mat是储存图像的数据结构(C++)
但是在python中已经将其二次封装为ndarray格式了,丢失一些属性(成员函数)
# mat数据之共享头
# mat的深浅拷贝
import cv2
import numpy as np
img = cv2.imread('cat.jpeg')
# 浅拷贝:头尾都相连
img2 = img.view() #创建一个视图
# 深拷贝, 只有头部相连
img3 = img.copy()
img[10:100, 10:100] = [0, 0, 255]
##横着堆叠
#cv2.imshow('img', np.hstack((img, img2, img3)))
#竖着堆叠
cv2.imshow('img', np.vstack((img, img2, img3)))
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
#img = np.zeros((480, 640, 3), np.uint8)
img = cv2.imread('cat.jpeg')
b,g,r = cv2.split(img)
b[10:100, 10:100] = 255
g[10:100, 10:100] = 255
img2 = cv2.merge((b, g, r))
cv2.imshow('img', img)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
##划线只有实线
## cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
## cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
'''
##1111111111 矩形的起终点是矩形的对角点
cv2.rectangle(img, (10, 10), (200, 200), (0, 255, 0), 5)
'''
'''
##22222222222 圆形 最后是线宽和去毛刺
cv2.circle(img, (320, 240), 200, (0, 0, 255), 10, 16)
'''
'''
##3333333333333 椭圆 用矩形框椭圆
## 画椭圆ellipse(img, center, 长宽的一半,角度,从哪个角度开始,从哪个角度结束)
#可以只画局部 控制开始角度和结束角度0 ,360
#可以任意角度控制椭圆,参数angle
cv2.ellipse(img, (320, 240), (200, 50), 0, 0, 360, (0, 0, 255), 5, 16)
#cv2.ellipse(img, (320, 240), (200, 50), 45, 0, 360, (0, 0, 255), 5, 16)
#cv2.ellipse(img, (320, 240), (200, 50), 0, 0, 180, (0, 0, 255), 5, 16)
'''
##44444444444 画多边形和填充多边形,多个点连起来
#多边形点集, 32位是C语言底层的规定
pts = np.array([(250, 10), (10, 30),(150, 100), (450, 100)], np.int32)
#cv2.polylines(img, [pts], True, (0, 0, 255), 8)
cv2.fillPoly(img, [pts], (0, 0, 255), 8)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制英文文本和中文文本
putText
从左下角开始算
import cv2
import numpy as np
#org 文本框左下角的定位
img = np.zeros((480, 640, 3), np.uint8)
#cv2.putText(img, 'Hello Kitti', (50, 200), cv2.FONT_HERSHEY_COMPLEX, 3, [0, 0, 255])
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
曲线救国,使用pillow,再转为opencv显示
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
#显示中文
#全白
img = np.full((500, 500, 3), fill_value=255, dtype=np.uint8)
#导入字体: C://windows//font 下是电脑里的所有字体,复制想要的字体到我们的路径下
#这里调整字体大小
font = ImageFont.truetype('hyswlongfangsong.ttf', 35)
#创建一个pillow图片
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
#利用draw绘制中文
draw.text((100, 250), '但很快就撒', font=font, fill=(0, 0, 0, 0))
#重新变回ndarray
img = np.array(img_pil)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()