10.Opencv的重要结构体Mat—深拷贝与浅拷贝

发布时间:2025-01-15 19:01

目录

Mat深拷贝与浅拷贝

​ 访问图像(Mat)的属性

通道的分离与合并

Mat是什么?

是一个矩阵,灰色图像2通道,彩色图像3通道。

Mat的优点:可以Numpy以矩阵的方式进行访问,操作方便。

\"10.Opencv的重要结构体Mat—深拷贝与浅拷贝_第1张图片\"

 \"10.Opencv的重要结构体Mat—深拷贝与浅拷贝_第2张图片\"

Mat深拷贝与浅拷贝

\"10.Opencv的重要结构体Mat—深拷贝与浅拷贝_第3张图片\"

拷贝Mat时默认为浅拷贝,只拷贝Header中的内容,数据不变

Mat浅拷贝

Mat A

A = imread(file, IMREAD_COLOR)

Mat B(A);

B与A的Header不同,但指向的数据相同

Mat深拷贝

C++中实现方式有两种

cv ::Mat::clone()

cv::Mat::copyTo()

将DATA也重新赋值一份,A与B完全切断

python中实现:

copy(),使用该方法就是深拷贝

进行深拷贝后,进行图片的处理时不影响原图片,cv2.add也是深拷贝操作

实际测试:

import cv2
import numpy as np

img = cv2.imread(\'C:\\\\Users\\\\Mengyang\\\\Desktop\\\\112.png\')

#浅拷贝
img2 = img

#深拷贝
img3 = img.copy()

img[10:100,10:100] = [0,0,255]

cv2.imshow(\'img\',img)
cv2.imshow(\'img2\',img2)
cv2.imshow(\'img3\',img3)

cv2.waitKey(0)

运行结果:

\"10.Opencv的重要结构体Mat—深拷贝与浅拷贝_第4张图片\" 访问图像(Mat)的属性

主要为使用print()函数打印输出图像的参数

import cv2
import numpy as np

img = cv2.imread(\'C:\\\\Users\\\\Mengyang\\\\Desktop\\\\112.png\')

print(img.shape)  #shape中包含三个信息,长度 宽度 通道数
print(img.size)   #图像占用多大的空间,长度*宽度*通道数
print(img.dtype)   #图像中每个元素的位深 uint8表示8位无符号整型0~255

运行结果:

\"\"

通道的分离与合并

正常的图片含有3个通道,BGR,通道的分离与合并主要采用2个API

split(mat)      分割图像的通道

merge((ch1,ch2,...))   将多个通道合并在一起,输出为一个mat

import cv2
import numpy as np

img = np.zeros((480,640,3),np.uint8)

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)

运行结果:

\"10.Opencv的重要结构体Mat—深拷贝与浅拷贝_第5张图片\"

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号