天天看点

opencv之Mat 类赋值的理解

今天看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;
}


           

执行程序后的结果:

opencv之Mat 类赋值的理解
opencv之Mat 类赋值的理解
opencv之Mat 类赋值的理解
opencv之Mat 类赋值的理解
opencv之Mat 类赋值的理解
opencv之Mat 类赋值的理解