学习OpenCV3:形参是Mat,*Mat,&Mat时图片变化情况


#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
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;
}

运行结果:

分析:
  img1img2img3最初都是一张白色空白图片,分别将它们传入形参是Mat*Mat&Mat的函数,在函数内分别画蓝绿红3种颜色的线。函数调用结束后显示图片,发现img1img2img3也对应画出蓝绿红3种颜色的线。这说明Mat*Mat&Mat为形参时,只要修改形参便会相应改变实参。

总结:
1、Mat像智能指针一样管理内存区域,使用=赋值时,两个Mat指向同一内存区域,使用clone, copyTo赋值时,两个Mat数据相同,但指向的内存区域不同。
2、传递Mat时,形参与实参指向相同的内存区域,在函数内修改形参会相应修改实参。
3、传递*Mat时,形参与实参指向同一个Mat,修改形参指向的Mat会相应修改实参指向的Mat。
4、传递&Mat时,形参只是实参的一个别名,形参与实参是同一个Mat,修改形参会相应改变实参。

猜你喜欢

转载自blog.csdn.net/qq_34801642/article/details/106688166
Mat