zoukankan      html  css  js  c++  java
  • opencv的基本数据结构(二)(转)

    转自:原文链接,以下代码、图片、内容有点改动,只为转载不降低博客内容的可阅性,版权归原作者所有。

    OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括:

    •          Vec
    •          Scalar
    •          Point
    •          Size
    •          Rect
    •          RotatedRect

    1. Vec类

    1.1 基本概念

             Vec是一个模板类,主要用于存储数值向量。

    1.2 用法

    (1)可用它来定义任意类型的向量

    Vec<double, 8> myVector; // 定义一个存放8个double型变量的向量  

    (2)使用[ ]访问Vec向量成员  

    myVector[0]=0;  

     (3)可使用以下预定义的类型

    typedef Vec<uchar, 2> Vec2b;  
    typedef Vec<uchar, 3> Vec3b;  
    typedef Vec<uchar, 4> Vec4b;  
    typedef Vec<short, 2> Vec2s;  
    typedef Vec<short, 3> Vec3s;  
    typedef Vec<short, 4> Vec4s;  
    typedef Vec<int, 2> Vec2i;  
    typedef Vec<int, 3> Vec3i;  
    typedef Vec<int, 4> Vec4i;  
    typedef Vec<float, 2> Vec2f;  
    typedef Vec<float, 3> Vec3f;  
    typedef Vec<float, 4> Vec4f;  
    typedef Vec<float, 6> Vec6f;  
    typedef Vec<double, 2> Vec2d;  
    typedef Vec<double, 3> Vec3d;  
    typedef Vec<double, 4> Vec4d;  
    typedef Vec<double, 6> Vec6d;  
    //可以直接运用
    Vec3b mychar;
    mychar[2]='cat';
    Vec6d mydata;
    for(int i=0; i<mydata.rows;i++)
    mydata[i] = 20.3+18*i;
    cout<<"mydata="<<mydata<<endl;

    (4)Vec支持的运算如下:

    v1 = v2 + v3  
    v1 = v2 - v3  
    v1 = v2 * scale  
    v1 = scale * v2  
    v1 = -v2  
    v1 += v2  
    v1 == v2, v1 != v2  
    norm(v1) (euclidean norm)//欧几里得范数
    //求mydata的
    欧几里得范数
    norm(mydata);

    1.3 示例代码

    (1)向量定义与元素的访问

    // Vec  
         cv::Vec<double, 8>  myVector;  
         for(int i=0; i<myVector.rows;i++)  
              myVector[i] = i;  
         cout<<"myVector= "<<myVector<<endl;  
         cout<<"myVector[0]= "<<myVector[0]<<endl;  
         cout<<"myVector[3]= "<<myVector[3]<<endl;  

    (2)基本运算

    cv::Vec<int, 6> v1,v2,v3;  
            for(int i=0; i<v2.rows;i++){ //v2.rows返回向量v2的行数  
                        v2[i] = i;  
                        v3[i] = i+1;  
                 }  
             
            v1 = v2 + v3;  
            cout<<"v2       = "<<v2<<endl;  
            cout<<"v3       = "<<v3<<endl;  
            cout<<"v1=v2+v3= "<<v1<<endl;  
            cout<<"v1=v2*2  = "<<v2*2<<endl;  
            cout<<"v1=-v2   = "<<-v2<<endl;  
            cout<<"v1==v2   = "<<(v1==v2)<<endl;  
            cout<<"v1!=v2   = "<<(v1!=v2)<<endl;  
            cout<<"norm(v2)= "<<norm(v2)<<endl; 

    2. Scalar类

    2.1 基本概念

    Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。

    2.2 用法

    可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。

    cv:: Scalar( B, G, R ) 

    2.3 示例代码

    (1)cv::Scalar结构

    cv::Scalar myScalar;  
        myScalar = cv::Scalar(0,255,0);  
        cout<<"myScalar = "<<myScalar<<endl;  
        system("pause");  

    (2)读取彩色图像像素值

    彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。

    OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
    因此,访问彩色像素中元素的方法如下:

    cv::Mat pImg = cv::imread("1.jpg",1);  
        if(!pImg.data)  
            return 0;  
        int x = 100, y = 100;  
        cv::Scalar pixel=pImg.at<Vec3b>(x,y);  
        cout<<"B chanel of pixel is = "<<pixel.val[0]<<endl;  
        cout<<"G chanel of pixel is = "<<pixel.val[1]<<endl;  
        cout<<"R chanel of pixel is = "<<pixel.val[2]<<endl;  
        system("pause");  

    3. Point类

    3.1 基本概念 

    常用于表示2维坐标(x,y)。

    3.2 用法

    (1)图像坐标

    对图像而言,我们可以这样定义:

    cv::Point pt;  
    pt.x = 10;  
    pt.y = 8;  

    或者:

    Point pt = Point(10,8);
    Point pt(10,8);

    (2)或使用如下预定义:

    typedef Point_<int> Point2i;  
    typedef Point2i Point; //上面使用Point
    typedef Point_<float> Point2f;  
    typedef Point_<double> Point2d;  

    可见Point_<int>、Point2i、Point互相等价,Point_<float>和Point2f互相等价,Point_<double>和Point2d互相等价。

    (3)基本运算

    pt1 = pt2 + pt3;  
    pt1 = pt2 - pt3;  
    pt1 = pt2 * a;  
    pt1 = a * pt2;  
    pt1 += pt2;  
    pt1 -= pt2;  
    pt1 *= a;  
    double value = norm(pt); // L2 norm  
    pt1 == pt2;  
    pt1 != pt2;  

    3.3 示例代码

    (1)设置坐标点

    // Point  
        Point pt;  
        pt.x = 300;  
        pt.y = 498;  
        //或者  
        //Point  pt (300,498);  
        Scalar pix = pImg.at<Vec3b>(pt);  
        cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;  

    (2)各类运算

    cv::Point pt1(10,20);  
        cv::Point pt2(2,3);  
        cout<<"pt1     = "<<pt1<<endl;  
        cout<<"pt2     = "<<pt2<<endl;  
        cout<<"pt1+pt2 = "<<pt1+pt2<<endl;  
        cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;  
        cout<<"pt1-pt2 = "<<pt1-pt2<<endl;  
        cout<<"pt2*2   = "<<pt2*2<<endl;  

    4. Size类

    4.1 基本概念

    模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height还有一个有用的面积函数area()。

    4.2 用法

    cv::Size size(int w, int h);  
    //或者  
    cv::Size size;  
    size.width = w;  
    size.height = h;  

    4.3 示例代码

    // Size  
        cv::Size size1(6,3);  
        cv::Size size2;  
        size2.width = 4;  
        size2.height = 2;  
        cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));  
        cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));  
        cout<<"mat1 = "<<endl<<mat1<<endl;  
        cout<<endl<<"mat2 = "<<endl<<mat2<<endl;  
        system("pause");  

     

    5. Rect类

    5.1 基本概念

    Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:

    • 矩形左上角坐标: (x,y)
    • 矩形的宽和高: width, height

    Rect可以用来定义图像的ROI区域。

    5.2 用法

    cv::Rect rect(x, y, width, height); 

    5.3 示例代码

    // Rect  
        cv::Mat pImg = imread("Lena.jpg",1);  
        cv::Rect  rect(180,200,200,200);//(x,y)=(180,200),w=200,height=200  
        cv::Mat  roi = cv::Mat(pImg, rect);  
        cv::Mat  pImgRect = pImg.clone();  
        cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2);  
        cv::imshow("original image with rectangle",pImgRect);  
        cv::imshow("roi",roi);  
        cv::waitKey();  

    6. RotatedRect类

    6.1 基本概念

    最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。

    6.2 用法

    旋转矩形类的构造函数:

    RotatedRect(const Point2f& center, const Size2f& size, float angle);  

    参数:

    • center:中心点坐标Point2f类型
    • size:矩形的宽度和高度,Size2f类型
    • angle:顺时针方向的旋转角度(单位°),float类型

    6.3 示例代码

    cv::Point2f center(100, 100);
    	cv::Size2f size(100, 50);
    	float bn = 10;
    	float angle[3];
    	for (int i = 0; i < 3; i++)
    		angle[i] = bn+i*20;//angle=10,30,50
    	for (int i = 0; i < 3; i++)
    	{ 
    		RotatedRect rRect(center, size, angle[i]);
    		cv::Mat image(200, 200, CV_8UC3, cv::Scalar(0));
    		Point2f vertices[4];
    		rRect.points(vertices);
    		for (int i = 0; i < 4; i++)
    			line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0));
    		Rect brect = rRect.boundingRect();
    		rectangle(image, brect, Scalar(255, 0, 0));
    		ostringstream oss;
    		oss << "rectangles" << i << endl;
    		imshow(oss.str(), image);
    	}
    	
    	waitKey(0);  //system("pause")亦可

  • 相关阅读:
    回流和重绘
    php 异常捕获的坑
    每周散记 20180806
    转: Linux mount/unmount命令
    python http 请求 响应 post表单提交
    每周散记 20180723
    优惠劵产品分析
    c++ 软件版本比较函数
    每周散记
    转: 系统问题排查思路
  • 原文地址:https://www.cnblogs.com/cvtoEyes/p/8494516.html
Copyright © 2011-2022 走看看