opencv再学习之路(一)---基础知识

1 clone()与copyTo()的区别

copyto() 源代码:

1 inline Mat Mat::clone() const
2 {
3     Mat m;
4     copyTo(m);
5     return m;
6 }

clone()和copyTo()最大的区别在于clone()会给目标矩阵分配新地址,而copyTo()不会。 

例子1:

1 Mat img1 = ones(1, 5, CV_32F);
2 Mat img2 = img1;
3 Mat img3 = zeros(1, 5, CV_32F);
4 img3.copyTo(img1);
5 cout << img1 << endl;
6 cout << img2 << endl;

output: 
[0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0]

例子2:

1 Mat img1 = ones(1, 5, CV_32F);
2 Mat img2 = img1;
3 Mat img3 = zeros(1, 5, CV_32F);
4 img1 = img3.clone();
5 cout << img1 << endl;
6 cout << img2 << endl;

output: 
[0, 0, 0, 0, 0] 
[1, 1, 1, 1, 1]

例2中可见clone()替img1申请了一块新内存,而img2仍指向原来的img1的地址,所以img2不变

函数 srcImage.copyto(dstImage, mask)

  mask作为一个掩模板,如果在某个像素点(i, j)其值为1(只看第一通道,所以mask单通道即可)则把srcImage.at(i, j)处的值直接赋给dstImage.at(i, j),如果其值为0则dstImage.at(i, j)处保留其原始像素值。

2 namedwindow() 函数

1 namedWindow("WINDOW_AUTOSIZE",WINDOW_AUTOSIZE);

 默认的创建窗口的namedWindow参数为WINDOW_AUTOSIZE。窗口大小会自动调整以适应所显示的图像,但是不能更改大小。

1 namedWindow("WINDOW_NORMAL",WINDOW_NORMAL);
采用 WINDOW_NORMAL 参数可以用鼠标拖动调整窗口的大小

 3 常用的数据结构总结

 1        // Mat的用法
 2     Mat m1(2, 2, CV_8UC3, Scalar(0, 0, 255));  //其中宏的解释: CV_[位数][带符号与否][类型前缀]C[通道数]
 3     cout << m1 << endl;
 4 
 5     // 或者利用IplImage指针来初始化,将IplImage*转化为Mat
 6     IplImage* image = cvLoadImage("1.jpg");
 7     Mat mat = cvarrToMat(image);
 8     imshow("IplImage*转化为Mat", mat);
 9 
10     // Mat转换为 IplImage
11     IplImage img = IplImage(mat);
12 
13     // 或者
14     Mat m2;
15     m2.create(4, 5, CV_8UC3);

29 // 点的表示 30 Point p; 31 p.x = 1; // x的坐标 32 p.y = 1; // y的坐标 33 34 // 或者 35 Point p2(1,1); 36 37 // 颜色的表示:Scalar(b,g,r) 注意不是rgb 38 Scalar(1, 1, 1); 39 40 // 尺寸的表示:size 41 Size(5, 5); //宽和高度都是5 42 43 // 如果创建一个Rect 对象rect(100, 50, 50, 100),那么 rect 会有一下的功能: 44 45 // 矩形的表示:Rect, 成员变量有x,y,width,height 46 Rect rect(100, 50, 50, 100); 47 rect.area(); // 返回rect的面积 5000 48 rect.size(); // 返回rect的尺寸 50*100 49 rect.tl(); // 返回rect的左上顶点的坐标 [100, 50] 50 rect.br(); // 返回rect的右下顶点的坐标 [150, 150] 51 52 rect.width; // 返回rect的宽度 53 rect.height; // 返回rect的高度 54 55 // 对两个矩形求交集和并集 56 Rect rect1; 57 Rect rect2; 58 59 rect = rect1 & rect2; 60 rect = rect1 | rect2; 61 62 // 还可以对矩形进行平移和缩放 63 rect = rect + Point(100, -100); // 平移,矩形左上顶点的x坐标 +100,y坐标 -100 64 rect = rect + Size(-100, 100); // 缩放,左上顶点不变,宽度 -100, 高度 +100 65 66 // 围绕矩形中心进行缩放 67 Rect rectCenterScale(Rect rect, Size Size) 68 { 69 rect = rect + size; // 先缩放 70 Point cpt; 71 cpt.x = rect.x + cvRound(rect.width/2.0); 72 cpt.y = rect.y + cvRound(rect.height/2,0); 73 return (rect - cpt); 74 } 75 76 // 还可以对矩形进行对比,返回布尔变量 77 bool a1 = rect1 == rect2; 78 bool a2 = rect1 != rect2; 79 80 // 自己编写的获取矩形中心函数 81 Point getCenterPoint(Rect rect) 82 { 83 Point cpt; 84 cpt.x = rect.x + cvRound(rect.width/2.0); // cvRound() 是将实数转为整数 85 cpt.y = rect.y + cvRound(rect.height/2.0); 86 return cpt; 87 88 }

 4. 将单通道的灰度图转为三通道BGR图

 1 void main()
 2 {
 3 
 4     Mat image = imread("03.jpg");
 5 
 6     Mat gray;
 7     Mat dst;
 8 
 9     cvtColor( image, gray, CV_RGB2GRAY);
10 
11     imshow("原图", image);
12     imshow("灰度图", gray);
13 
14     cvtColor(gray, dst, CV_GRAY2BGR);
15     imshow("三通道图", dst);
16 
17     waitKey(0);
18 }

原文地址:https://www.cnblogs.com/zhp218/p/8521080.html