OpenCV基础知识
一.BGR
在日常生活中,顺序通常为RGB也就是Red,Blue,Green,但是在OpenCV中格式是反的
二.HSV
分别代表:
Hue:色相、色彩,比如红色,蓝色,绿色
Saturation:饱和度,色彩的纯度
Value:明度
三.色彩空间的转换
import cv2
#空的回调函数
def callback():
pass
#创建一个窗口用于颜色空间演示
cv2.namedWindow('Color_Demo', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Color_Demo', 640, 640)
imgpath = 'src/dangao.jpg'
img = cv2.imread(imgpath)
# 定义颜色空间转换的编码列表
colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY,
cv2.COLOR_BGR2HSV_FULL, cv2.COLOR_BGR2YUV]
# 在窗口中创建一个轨迹条以选择当前颜色空间
cv2.createTrackbar('current_color', 'Color_Demo', 0, len(colorspaces)-1, callback)
while True:
index = cv2.getTrackbarPos('current_color', 'Color_Demo')
# 颜色空间转换API
color_code = colorspaces[index]
cvt_img = cv2.cvtColor(img,color_code)
# 显示转换后的图像
cv2.imshow('Color_Demo', cvt_img)
key=cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
四.numpy库
1.OpenCV中用到的矩阵都要转换成Numpy数组
2.Numpy是一个经高度优化的Python数值库
1.创建矩阵:创建数组,创建全零数组zeros/ones,创建全值数组full,创建单位矩阵identity/eye
import numpy as np
import cv2
#创建一个数组
a = np.array([1,2,3])
print(a)
#二维数组
b = np.array([[1,2,3],[4,5,6]])
print(b)
#前面表示行数,后面表示列数,3表示通道数/层数
c = np.zeros((5,4,3))
#打印出来显示是5个4行3列的矩阵,但是对于OpenCv来说,是高度为5,宽度为4的图像,每个像素点有3个通道
print(c)
d = np.zeros((5,4))
#打印出来就是5行4列的矩阵
print(d)
#定义ones矩阵
e = np.ones((3,4))
#三行四列矩阵
print(e)
#full矩阵,第二个为参数,全为255的意思
f = np.full((3,4),255)
print(f)
#单位矩阵,4*4的单位矩阵
f = np.identity(4)
print(f)
#非对称的矩阵,类似于单位矩阵的排列
g = np.eye(4,5)
print(g)
2.检索与赋值[y,x]
import numpy as np
import cv2
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 640, 480)
#生成一个480x640的黑色图像
img = np.zeros((480, 640,3), np.uint8)
#竖着打印一条蓝色的线bgr
for i in range(480):
img[i,200]=[255,0,0]
cv2.imshow('image', img)
if cv2.waitKey(0) & 0xFF == ord('q'):
cv2.destroyAllWindows()
3.获取子数组
import numpy as np
import cv2
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 640, 480)
img = np.zeros((480, 640,3), np.uint8)
#在黑色背景上再换一个红色的矩形
roi = img[100:400,100:600]
roi[:,:]=[0,0,255]
#在它上面再画一个正方形
roi[10:100,10:100]= [255,0,0]
cv2.imshow('image', img)
if cv2.waitKey(0) & 0xFF == ord('q'):
cv2.destroyAllWindows()
五.Mat
1.深拷贝和浅拷贝
import cv2
import numpy as np
cv2.namedWindow('image1', cv2.WINDOW_NORMAL)
cv2.namedWindow('image2', cv2.WINDOW_NORMAL)
cv2.namedWindow('image3', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image1', 640, 640)
cv2.resizeWindow('image2', 640, 640)
cv2.resizeWindow('image3', 640, 640)
imgpath = 'src/fengjing.jpg'
img = cv2.imread(imgpath)
#浅拷贝,拷贝一份引用,对img修改,img2也会跟着修改
img2 = img
#深拷贝 直接独立拷贝一份出去,img修改不会影响img3
img3 = img.copy()
#对此范围进行修改==画了一个红色正方形
img[10:100,10:100]=(0,0,255)
cv2.imshow('image1', img)
cv2.imshow('image2', img2) #和img一样有红色正方形
cv2.imshow('image3', img3) #没有红色正方形
cv2.waitKey(0)
cv2.destroyAllWindows()
2.访问Mat属性
import cv2
import numpy as np
imgpath = "src/fengjing.jpg"
img = cv2.imread(imgpath)
#访问mat属性:高、宽、通道数
print(img.shape)
#空间高*宽*通道数
print(img.size)