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

[转载] OpenCV2.4.3 CheatSheet学习(一)的更多相关文章

  1. [转载] OpenCV2.4.3 CheatSheet学习(四)

    五.数据的输入和输出 1. 将数据写入YAML(或XML) 注意,在OpenCV中,无论读写,文件的格式均由指定的后缀名确定.示例: FileStorage fs("test.yml&quo ...

  2. [转载] OpenCV2.4.3 CheatSheet学习(三)

    四.图像处理(呵呵,重头戏来了) 1. 滤波 filter2D() 用核函数对图像做卷积. sepFilter2D() 用分解的核函数对图像做卷积. 首先,图像的每一行与一维的核kernelX做卷积: ...

  3. [转载] OpenCV2.4.3 CheatSheet学习(二)

    二.矩阵操作(拷贝.洗牌.局部访问): src.copyTo(dst) 把src矩阵中的数据拷贝到dst. src.convertTo(dst, type,scale, shift) 缩放并转换到另外 ...

  4. [转载]Android开发者必须深入学习的10个应用开源项目

    [转载]Android开发者必须深入学习的10个应用开源项目 原文地址:Android开发者必须深入学习的10个应用开源项目(http://blog.sina.com.cn/s/blog_7b8a63 ...

  5. 转载 ASP.NET Web API 学习

    转载关于ASP.NET Web API 的学习网址 http://www.cnblogs.com/aehyok/p/3432158.html http://www.mashangpiao.net/Ar ...

  6. (转载)prepare函数的学习,我要学习php第二天

    (转载)http://www.boyuan78.com/htm/company/2012_1030_60.html prepare函数的学习,我要学习php第二天 $mysqli = new mysq ...

  7. [转载]Deep Learning(深度学习)学习笔记整理

    转载自:http://blog.csdn.net/zouxy09/article/details/8775360 感谢原作者:zouxy09@qq.com 八.Deep learning训练过程 8. ...

  8. 转载:Network In Network学习笔记

    转载原文1:http://blog.csdn.net/hjimce/article/details/50458190 转载原文2:http://blog.csdn.net/mounty_fsc/art ...

  9. 【转载-Andrew_qian】stm32中断学习

    [转载]stm32中断学习 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大 ...

随机推荐

  1. 141 x的平方根

    原题网址:http://www.lintcode.com/zh-cn/problem/sqrtx/ 实现 int sqrt(int x) 函数,计算并返回 x 的平方根. 您在真实的面试中是否遇到过这 ...

  2. spss logistic回归分析结果如何分析

    spss logistic回归分析结果如何分析 如何用spss17.0进行二元和多元logistic回归分析 一.二元logistic回归分析 二元logistic回归分析的前提为因变量是可以转化为0 ...

  3. 旋转矩形碰撞检测 OBB方向包围盒算法

    在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于 ...

  4. SpringAOP中的aop:config标签

    我们使用Spring的AOP功能的时候发现,我们使用普通的配置方式的时候,我们无法精确的确定将切面类中的哪个方法切入到哪个切入点上, 所以我们可以使用aop的专用标签来完成相关的配置.其中主要表现是使 ...

  5. Python flask 构建可扩展的restful apl✍✍✍

    Python flask 构建可扩展的restful apl  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  6. http及浏览器相关知识点归纳

    http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...

  7. Python全栈开发:XML与parse对比

    #!/usr/bin/env python # -*- coding;utf-8 -*- """ ET.XML和ET.parse的对比 1.返回对象差异: ET.XML: ...

  8. 学习 debug

    要在代码编辑器中设置源代码断点,有以下 4 种操作方式. (1) 把光标移到要设为断点的行上,按下 F5 键. (2) 用鼠标左键单击要设为断点的行的最左端. (3) 用鼠标右键单击要设为断点的行,在 ...

  9. 【9.14NOIP模拟pj】wtaxi 题解

    [9.14NOIP模拟pj]wtaxi 搜索

  10. Codeforces Round #258 (Div. 2)E - Devu and Flowers

    题意:n<20个箱子,每个里面有fi朵颜色相同的花,不同箱子里的花颜色不同,要求取出s朵花,问方案数 题解:假设不考虑箱子的数量限制,隔板法可得方案数是c(s+n-1,n-1),当某个箱子里的数 ...