今天看opencv技术手册中的Mat类:
看到这儿的时候出现了很大的疑惑:
Their headers are different, however, and
making a modification using any of them will affect all the other ones as well.
举个例子:
Mat image;//定义一个Mat 类 的对象image
Mat A;//定义一个Mat 类 的对象A
A=image;//将image赋值给A
现在如果修改A 那么image 里面的内容也会被修改.
经过实践验证,上面的说法是正确的。那么问题来了,如果你只想修改A而不想修改原始图像怎么办了?
经过实践验证,下面的代码是可行的:
Mat image;//定义一个Mat 类 的对象image
Mat A;//定义一个Mat 类 的对象A
A=image+0;//将image赋值给A
在赋值的时候后面加0就可以了。
下面是验证的整体程序:
// opencv_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string imageName("nnnbb.bmp"); // 赋值图像的名称
//string imageName("baboon.jpg"); // by default
if (argc > 1)
{
imageName =(char)argv[1];
}
Mat image;
image = imread(imageName.c_str(), CV_LOAD_IMAGE_UNCHANGED); // 将图像读入image
if (image.data==NULL) // 判断是否读入图像
{
cout << "Could not open or find the image" << std::endl;
return -1;
}
Mat A = image;//将图像image 赋值给A
A = A - 100;//改变A 通过输出窗口Display windowimage 和 Display windowA 观察image是否改变
Mat C = A+0 ;//定义C 将A加0赋值给C
C = C + 100;//改变C 通过输出窗口Display windowA 和 Display windowC 观察A是否改变
//创建输出窗口
namedWindow("Display windowimage", WND_PROP_AUTOSIZE);
namedWindow("Display windowA", WND_PROP_AUTOSIZE);
namedWindow("Display windowC", WND_PROP_AUTOSIZE);
//显示图像
imshow("Display windowimage", image);
imshow("Display windowA", A);
imshow("Display windowC", C);
waitKey(0); // 一直显示
return 0;
}
执行程序后的结果: