#include
#include
#include
using namespace std;
using namespace cv;
void draw1(Mat img)
{
int y = 20;
line(img, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(255, 0, 0), 2); //画蓝线
}
void draw2(Mat *p)
{
int y = 40;
Mat img = *p;
line(img, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(0, 255, 0), 2); // 画绿线
}
void draw3(Mat &img)
{
int y = 60;
line(img, cv::Point(0, y), cv::Point(img.cols, y), cv::Scalar(0, 0, 255), 2); // 画红线
}
int main()
{
int w = 200, h = 150;
Mat img1 = Mat(h, w, CV_8UC3, Scalar(255, 255, 255));// 白色空白图片
draw1(img1);// 画蓝线
imshow("1", img1);
Mat img2 = Mat(h, w, CV_8UC3, Scalar(255, 255, 255));// 白色空白图片
draw2(&img2);// 画绿线
imshow("2", img2);
Mat img3 = Mat(h, w, CV_8UC3, Scalar(255, 255, 255));// 白色空白图片
draw3(img3); // 画红线
imshow("3", img3);
waitKey();
return 0;
}
运行结果:
分析:
img1
、img2
和img3
最初都是一张白色空白图片,分别将它们传入形参是Mat
,*Mat
,&Mat
的函数,在函数内分别画蓝绿红3种颜色的线。函数调用结束后显示图片,发现img1
、img2
和img3
也对应画出蓝绿红3种颜色的线。这说明以Mat
,*Mat
,&Mat
为形参时,只要修改形参便会相应改变实参。
总结:
1、Mat像智能指针一样管理内存区域,使用=
赋值时,两个Mat指向同一内存区域,使用clone, copyTo
赋值时,两个Mat数据相同,但指向的内存区域不同。
2、传递Mat
时,形参与实参指向相同的内存区域,在函数内修改形参会相应修改实参。
3、传递*Mat
时,形参与实参指向同一个Mat,修改形参指向的Mat会相应修改实参指向的Mat。
4、传递&Mat
时,形参只是实参的一个别名,形参与实参是同一个Mat,修改形参会相应改变实参。