OpenCV中Mat操作“ =“ 、clone() 与copyto()的区别

1、“=” 浅拷贝

浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)

Mat a = imread("1.jpg");

Mat b = a; //a "copy" to b

Mat c(a); //a "copy" to c

a.col(10)=0;//把a的第十列全置0,b和c也相应发生变化

 

2、"clone()" 完全深拷贝

clone 是完全的深拷贝,在内存中申请新的空间

Mat A  = Mat::ones(4,5,CV_32F);

Mat B = A.clone()    //clone 是完全的深拷贝,在内存中申请新的空间,与A独立

 

3、"copyTo()" 也是深拷贝

copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝.

Mat A  = Mat::ones(4,5,CV_32F);

Mat C;

A.copyTo(C) //此处的C矩阵大小与A大小不一致,则申请新的内存空间,并完成拷 贝,等同于clone()

Mat D = A.col(1);

A.col(0).copyTo(D) //此处D矩阵大小与A.col(0)大小一致,因此不会申请空间,而是直接进行拷贝,相当于把A的第1列赋值给第二列


// Mat is basically a class with two data parts: the matrix header and 

//a pointer to the matrix containing the pixel values 

 

#include <iostream>

#include <highgui.h>

 

using namespace std ;

using namespace cv ;

 

int main()

{

	Mat image = imread("1.png" , 0) ;

	

	//Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区

	//Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区

	//Mat image1 = image.clone() ;//完全拷贝,把image中的所有信息拷贝到image1中

	Mat image1 ;

	image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)

	for(int h = 0 ; h < image1.rows ; ++ h)

	{

		uchar* ptr = image1.ptr(h) ;

		for(int w = 0 ; w < image1.cols ; ++ w)

		{

			ptr[w] = 0 ;

		}

	}

	imshow("image" , image) ;

	imshow("image1" , image1) ;

	waitKey() ;

	return 0 ;

}

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV Mat 是一个基本的图像容器,用于存储和处理图像。下面是一些常用的 Mat 操作: 1. 创建 Mat 对象:可以通过构造函数或者 create() 函数创建 Mat 对象,例如: ```cpp // 创建一个 3 行,2 列的 CV_8UC1 类型的图像 cv::Mat image1(3, 2, CV_8UC1); // 创建一个 3 行,2 列的 CV_8UC3 类型的图像 cv::Mat image2(3, 2, CV_8UC3); // 创建一个空的图像 cv::Mat emptyImage; // 创建一个和另一个 Mat 对象相同大小和类型的图像 cv::Mat image3 = image1.clone(); ``` 2. 访问像素值:可以使用 at() 函数或者指针访问像素值,例如: ```cpp cv::Mat image = cv::imread("image.jpg"); // 使用 at() 函数访问像素值 cv::Vec3b pixel1 = image.at<cv::Vec3b>(0, 0); // 使用指针访问像素值 cv::Vec3b pixel2 = image.ptr<cv::Vec3b>(0)[0]; ``` 3. 图像拷贝:可以使用 copyTo() 函数将一个 Mat 对象拷贝到另一个 Mat 对象,例如: ```cpp cv::Mat image1 = cv::imread("image1.jpg"); cv::Mat image2; // 将 image1 拷贝到 image2 image1.copyTo(image2); ``` 4. 图像缩放:可以使用 resize() 函数对图像进行缩放,例如: ```cpp cv::Mat image = cv::imread("image.jpg"); cv::Mat resizedImage; // 将图像缩小一半 cv::resize(image, resizedImage, cv::Size(), 0.5, 0.5); ``` 5. 图像裁剪:可以使用 ROI(Region of Interest)对图像进行裁剪,例如: ```cpp cv::Mat image = cv::imread("image.jpg"); // 创建一个矩形,表示要裁剪的区域 cv::Rect roi(100, 100, 200, 200); // 裁剪图像 cv::Mat croppedImage = image(roi); ``` 6. 图像通道分离和合并:可以使用 split() 函数将图像通道分离,使用 merge() 函数将图像通道合并,例如: ```cpp cv::Mat image = cv::imread("image.jpg"); // 分离图像通道 std::vector<cv::Mat> channels; cv::split(image, channels); // 合并图像通道 cv::Mat mergedImage; cv::merge(channels, mergedImage); ``` 7. 图像类型转换:可以使用 cvtColor() 函数将图像类型进行转换,例如: ```cpp cv::Mat image = cv::imread("image.jpg"); // 将图像转换为灰度图像 cv::Mat grayImage; cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); ``` 以上是 Mat 操作的一些常用方法,还有很多其他的方法可以参考 OpenCV 官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值