• 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 }

  • 相关阅读:
    负载均衡机制
    测试先行
    MVC模式在Java Web应用程序中的实例
    MVC模式学习
    Java反射机制
    软件开发火狐自动填写用户名和密码
    23种设计模式概述
    站立会议总结02
    站立会议总结01
    买书最低价问题
  • 原文地址:https://www.cnblogs.com/zhp218/p/8521080.html
Copyright © 2020-2023  润新知