#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
// 创建一张空白图片img
int w = 400, h = 300;
Mat img = Mat(h, w, CV_8UC3, Scalar(255, 255, 255));
// 在img1上画蓝线
int y = 50;
Mat img1 = img;
line(img, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(255, 0, 0), 2);
// 在img2上画绿线
y = 100;
Mat img2 = img.clone();
line(img2, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(0, 255, 0), 2);
// 在img3上画红线
y = 150;
Mat img3;
img.copyTo(img3);
line(img3, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(0, 0, 255), 2);
// 显示img
imshow("img", img);
waitKey();
return 0;
}
运行结果:
分析与总结:
在img1
上画蓝线,在img2
上画绿线,在img3
上画红线,但运行结果在显示img
时出现蓝线。这说明修改img1
会改变img
,而修改img2
和img3
不会改变img
。
数据实体是实际存储数据的内存区域。而对象cv::Mat是数据实体的头,其内部的数据指针指向数据实体。cv::Mat像智能指针一样管理内存区域。
- 对于
=
,img1
与img
指向同一内存区域,故修改img1
会相应地修改img
; - 对于
clone
,img2
与img
虽然数据相同,但却指向不同的内存区域,修改img2
不会改变img
; copyTo
与clone
一样,img3
与img
数据相同,存储区域不同,修改img3
也不会改变img
。