【opencv】对利用Mat创建指向的理解

Mat tem(Size(3,4),CV_8UC1,Scalar(0));
Mat img=imread("XXXXX");

在opencv3.0中,如上利用Mat类来初始化一张图片或矩阵等,实际创建了指向矩阵或图片内存空间的引用即指针。

例1
void change(Mat img)
{
    img.at<uchar>(2, 0) = 1;
    cout << (int)img.at<uchar>(2, 0) << endl;
}
int main()
{
    Mat tem(Size(3,4),CV_8UC1,Scalar(0));
    cout << (int)tem.at<uchar>(2, 0) << endl;
    change(tem);
    cout <<(int)tem.at<uchar>(2, 0) << endl;
    system("pause");
}

结果:
0
1
1

分析:change函数形参为Mat img,在主函数内传入指向矩阵的tem,则在change函数内通过img对于矩阵数据的修改是落实到实际内存的修改,即第三次显示出的数字是1。

例2
int main()
{//探究利用Mat(Rect())截取图片,在截取图片上进行改动原图是否会发生变化
    Mat img = imread("C:\\Users\\Administrator\\Desktop\\NOTE\\实验图片\\test.png");
    Rect b(0, 0, 70, 80);
    Mat roi;
    //1.会出现改动
    //roi = img(b);
    //2.不会出现改动
    img(b).copyTo(roi);

    circle(roi,Point(20,30),10,Scalar(255,0,0),1,8);
    imshow("roi",roi);
    imshow("img", img);
    waitKey(0);

}

分析:利用第二种方法不会对原图进行改变的原因是因为进行了拷贝,而不是引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值