zoukankan      html  css  js  c++  java
  • [转载] 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

  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/eaglediao/p/7136527.html
Copyright © 2011-2022 走看看