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 }