Mat属性是opencv——c++描述图像的方式,在opencv——python中,由于python作为接口语言,将其套壳,故在python中Mat数据对应numpy的ndarray,底层还是Mat。
import cv2
dog = cv2.imread('./dog.jpeg')
cv2.imshow('dog', dog)
cv2.waitKey(0)
cv2.destroyAllWindows()
读取、显示、按任意键退出。
import cv2
img = cv2.imread('./dog.jpeg')
读取。
type(img)
numpy.ndarray
显示img类型。为numpy中的多维数组类型。
img.data
<memory at 0x00000237A63AA138>
img内存位置。
img.size
538920
img的元素个数。
img.dtype
dtype('uint8')
各个元素的类型,为uint8,0~255
img.shape
(480, 640, 3)
img的形状,各个维度的大小。
img.ndim
3
img数组的维度。
总结:用python的numpy的ndarray通过不同的形式可以把mat的数据结构描述出来。
深拷贝:
import cv2
import numpy as np
img = cv2.imread('./cat.jpeg')
# 浅拷贝.
img2 = img.view()
# 深拷贝
img3 = img.copy()
img2[10:100, 10: 100] = [0, 0, 255]
cv2.imshow('img', np.hstack((img, img2, img3)))
cv2.waitKey(0)
cv2.destroyAllWindows()
浅拷贝——共享数据。深拷贝——复制数据并独立出去。
采用浅拷贝,修改浅拷贝对象,原来的对象会发生改变。采用深拷贝由于独立了出去,故修改后不会影响到原来的对象。
其中np.hstack()为横着堆在一起。vstack为竖着堆在一起。
故改变浅拷贝结果为:
改变深拷贝:
img3[10:100, 10: 100] = [0, 0, 255]
结果为: