Mat
mat是一个结构体,表示一个矩阵,可以是一个通道的,也可以是3个通道。它有头部和底部之分,头部代表这个矩阵的属性,底部代表的是数据。
Mat的拷贝
浅拷贝 只是把mat的头部复制了一份,数据还是指向同一块,
Mat a = imread(file, IMREAD_COLOR)
Mat B(a) 把a复制给B,这是浅拷贝
如下图所示
Mat的深拷贝 把属性和数据全部拷贝出来,方法有
CV::Mat::clone()
CV::Mat::copyTo()
copy()
以下代码验证浅拷贝与深拷贝
import cv2
import numpy as np
img = cv2.imread('d:\\STUDY_OPENCV\\img\\2.jpg')
#浅拷贝
img2 = img
#深拷贝
img3 = img.copy()
img[10:100,10:100] = [0,0,255]#img改变了,img2也跟着改变
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
访问图像mat的一些基本属性
import cv2
import numpy as np
img = cv2.imread('d:\\STUDY_OPENCV\\img\\2.jpg')
#shape 属性中包括了三个信息,高度,长度,通道数
print(img.shape)
#图像占多大空间
#高度*长度*通道数
print(img.size)
#图像中每个元素的位深
print(img.dtype)
打印出来如下
图像通道的分离与合并
**split(mat)**把n个通道的图像分离成n个通道
**merge((ch1,ch2,ch3,…))**把多个通道合并成一个图像
import cv2
import numpy as np
img = np.zeros((480,640,3),np.uint8)
#img = cv2.imread('d:\\STUDY_OPENCV\\img\\2.jpg')
#分离通道
b,g,r = cv2.split(img)
b[10:100,10:100] = 255#分离出来的图片相当于只有一个通道,黑白颜色图片
g[10:100,10:100] = 255
print(b[400,250])
print(g[400,250])
#合并通道
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)
最后img2【10:100,10:100】矩阵是青色的