第一次作业大家差不多都完成了,代码部分不难写
#include<iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
Point pt1;
Point pt2;
int main()
{ Mat A(640, 480, CV_8UC3, Scalar(255, 255, 255)); //创建Mat的对象时候即可定下大小和颜色
Mat B = A; //可以看作是浅拷贝
Mat C = A.clone(); //可以看作是深拷贝
pt1.x =0.9*240 ;
pt1.y = 0.9*320;
pt2.x = 1.1*240;
pt2.y = 1.1*320;
rectangle(C,pt1, pt2, Scalar(255, 0, 0), -1, 8, 0);//直接画一个矩形
imshow("before_operation", A);
imshow("after_operation", C);
imwrite("A.jpg", A);
imwrite("B.jpg", C);
waitKey(0);
return 0;
}
重要的是对代码部分的理解了,大家都体会到了Mat跟指针似乎有着关系。其实我们定义了一个Mat A=imread(“xxxxxx”);此时可以把这个A看成两个部分,一个是存储了图像的部分的大矩阵;另外一个是记录了图像的大小并指向这个图像矩阵的信息头。当你只是简单的Mat B=A;时,你只是将A的信息头拷贝给B而已,相当于引用,给A起了一个别名B,并不会开辟新的内存来存储图像。而使用Mat C=A.clone()时,相当于重新开辟了一个存储图像的内存,重新创建了一个新的信息头。所以说Mat这个类的表现有些像指针,但它不是指针,它还是有存储图像的一部分的,只不过opencv为了防止大图像的复制对速度和内存带来的负担采取了引用机制,但你想完全复制还是可以的。
另外可以试试
Mat A=imread("xxxxxx");
Mat B=A;
Mat B=imread("yyyyyyyy");
会怎么样。