• [转载] OpenCV2.4.3 CheatSheet学习(一)


    OpenCV2.4.3 <wbr>CheatSheet学习(一)[转]

    OpenCV2.4.3 <wbr>CheatSheet学习(一)[转]

    OpenCV向MATLAB靠拢,图像的操作方法变得不那么C了,更m了一些。比如,MATLAB中的常用函数imshow、imread、imwrite函数在OpenCV中已经有了同名的兄弟。
    此外,OpenCV 2.4.3中更加强调对矩阵的操作,以前的CvMat和CvArr目测现在正在被一个新成员Mat给后来居上了。
    在doc目录里出现了一个Cheat Sheet,好家伙,原来是OpenCV的作弊纸呀,把基本用法整理成考试必备的模样,正好方便我们学习了。

    所以,我们来共同学习一下吧:

    一、矩阵基础操作:
    Mat image(240, 320, CV8UC3);
    第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示创建一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。

    image.create(480, 640, CV8UC3);
    分配(或重新分配)image矩阵,把大小设为480×640,类型设为CV8UC3。

    Mat A33(3, 3, CV_32F, Scalar(5));
    定义并初始化一个3×3的32bit浮点数矩阵,每个元素都设为5。

    Mat B33(3, 3, CV_32F);
    B33 = Scalar(5);
    和上面的作用一样。

    Mat C33 = Mat::ones(3, 3, CV32F)*5.;
    ones函数很像MATLAB里的语句吧。这句的意思是先定义一个3×3的32bit浮点数矩阵,元素全为1,所有元素再乘以5.0。

    Mat D33 = Mat::zeros(3, 3, CV32F) + 5.;
    和上面类似,先定义个3×3的32bit浮点数矩阵,元素全为0,再将所有元素加上5.0;

    double a = CV_PI/3;
    Mat A22 = (Mat_(2, 2) << cos(a), -sin(a), sin(a), cos(a));
    CV_PI就是少年派的那个派。第二句这个写法很牛x的样子,我也没见过,不过看样子是创建一个2×2的float矩阵,把后面四个三角函数值分别赋给4个元素。

    float B22data[] = {cos(a), -sin(a), sin(a), cos(a)};
    Mat B22 = Mat(2, 2, CV32F, B22data).clone();
    第一句创建一个普通数组B22data,第二句创建一个2×2的32bit浮点数矩阵,并使用用B22data数组里的值初始化,然后克隆一下赋给B22矩阵。
    为什么这里还要克隆一下,不是多此一举吗?不是的,用一个数组去初始化一个矩阵的话,你会发现这个矩阵引用了数组的内存地址。不克隆的话,上面例程的后果是B22data数组、Mat(2,2...)这个临时变量矩阵、B22矩阵这三把勺子都插在同一个碗里。

    randu(image, Scalar(0), Scalar(256));
    把image弄成一个符合正太分布的随机数矩阵,rand表示random,u表示uniform;第二个参数是随机数下限,方括号哦;第三个参数是随机数上限,圆括号。

    randn(image, Scalar(128), Scalar(10));
    高斯分布的随机数矩阵;第二个参数是均值,第三个参数是标差。

    Mat image_alias = image;
    没有拷贝里面的数据。

    float* Idata=new float[480*640*3];
    Mat I(480, 640, CV32FC3, Idata);
    第一句定义一个480×640×3×sizeof(float)字节这么大的数组;第二句创建一个矩阵I,引用的是Idata的地址。

    vector iptvec(10);
    Mat iP(iptvec); 
    还能和STL一起用啊,以前真不知道。第一句话创建了一个有10个Point的向量,注意Point有两个int型元素。第二句创建了一个矩阵,元素类型根据就自动设为CV_32SC2,表示32bit signed int,2个channel。

    IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
    Mat newC = cvarrToMat(oldC0);
    IplImage oldC1 = newC;
    CvMat oldC2 = newC;
    这是为了把经典的OpenCV图像导成矩阵,第一句创建一个320×240的图像;第二句话把IplImage转成Mat;第三句话把Mat转成IplImage;第四句把Mat转成CvMat。

    Mat newC2 = cvarrToMat(oldC0).clone();
    转换后克隆一下赋值。

    vector ptvec = Mat(iP);
    把Mat又转成vector。

    (转来转去真复杂对吧)

    A33.at(i,j) = A33.at(j,i)+1;
    操作A33矩阵在row为i,col为j处的元素。需要显式指定A33里的元素类型,本例是float。

    Mat dyImage(image.size(), image.type());
    for(int y = 1; y < image.rows-1; y++)
    {
    Vec3b* prevRow = image.ptr(y-1);
    Vec3b* nextRow = image.ptr(y+1);
    for(int x = 0; y < image.cols; x++)
    for(int c = 0; c < 3; c++)
    dyImage.at(y,x)[c] = saturate_cast(nextRow[x][c] - prevRow[x][c]);
    }
    第一句话创建一个和image大小、类型都一样的矩阵。
    Vec3b是一个预定义的类型,三个无符号字符组成的向量:
    typedef Vec Vec3b;
    saturate_cast是一个强制类型转换,把圆括号里的东西转换为尖括号里的类型。
    for循环里的语句是把矩阵dyImage里的元素都赋值为后一行的值减去前一行的值,注意这个矩阵里的值是个具有三个元素的向量,理解为数组就行了,所以用方括号访问。

    Mat::iterator it = image.begin(), itEnd = image.end();
    for(; it != itEnd; ++it)
    (*it)[1] ^= 255;
    用过STL里的迭代器吗?用过的话就不解释了,没用过的还是先看看STL吧。
    对image每个值(Vec3b向量)的第一个元素和0xFF做异或。


    sume
    2012.12.25

  • 相关阅读:
    Java基本开发环境搭建(适合第一次使用)
    在oracle中通过链接服务器(dblink)访问sql server
    C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果
    经典SQL语句大全
    程序员为何要写技术博客?
    收缩SQL数据库日志
    利用脚本设置本机IP地址
    在SQL Server 2005中连接Oracle,完成查询、插入操作
    Centos 7 下 Corosync + Pacemaker + psc + HA-proxy 实现业务高可用
    Centos 7 下 Corosync + Pacemaker + psc 实现 httpd 服务高可用
  • 原文地址:https://www.cnblogs.com/eaglediao/p/7136527.html
Copyright © 2020-2023  润新知