15.opencv:Mat数据结构和ndarray多维数组、深拷贝与浅拷贝

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]

 结果为:

 


版权声明:本文为wzfafabga原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。