原文转自:http://monkeycoding.com/?p=521
OpenCV有定義一些基本結構,像Point、Point2f、Size、Size2f、Rect、RotatedRect、Scalar等,方便我們進行影像處理,這些結構通常都當參數輸入,或是函式內部計算之用。
Point:2維整數點類別,通常用於影像的座標點,成員有x和y,要是輸入浮點數的話,則四捨五入取整數,以下為建構式和最基本的兩種賦值方法:
Point(int x, int y) //建構式
Point pt1(20,30);
Point pt2;
pt2.x = 20;
pt2.y = 30;
Point2f:2維浮點數點類別,通常用於幾何計算,用法和Point雷同,只是x和y是浮點數。
Point3i、Point3f、Point3d代表3維點x、y、z,而成員型態分別為int、float、double。
Size:尺寸類別,成員有width和height,分別表示寬和長(int型態),可用area()函式得到面積,以下為建構式最基本兩種賦值方法:
Size(int width, int height) //建構式
Size size1(150, 100);
Size size2;
size2.width = 150;
size2.height = 100;
int myArea = size2.area();
Size2f:尺寸類別,和Size用法雷同,只是width和height為float型態。
Rect:矩形類別,成員有x、y、width、height,分別表示左上角頂點的x座標,左上角頂點的y座標,矩形寬、矩形高,可用area()函式得到面積,以下為建構式和最基本的兩種賦值方法:
Rect(int x, int y, int width, int height) //建構式
Rect rect1(20,30,150,100);
Rect rect2;
rect2.x = 20;
rect2.y = 30;
rect2.width = 150;
rect2.height = 100;
int myRectArea = rect2.area();
RotatedRect:斜矩形類別,成員有矩形的質心center(Point2f類別),四周長size(Size2f類別)、旋轉角度angle(float類別),可用points()函式得到四個頂點,以下為建構式和最基本的兩種賦值方法:
RotatedRect(const Point2f ¢er, const Size2f &size, float angle) //建構式
RotatedRect rRect1(Point2f(150,150), Size2f(100,50), 30.0);
RotatedRect rRect2;
rRect2.center = Point2f(150,150);
rRect2.size = Size2f(100,50);
rRect2.angle = 30.0;
Point2f vertices[4];
rRect2.points(vertices);
Scalar:代表4元素的向量,一般用於像素顏色,以下設定給灰階圖和彩色圖像素的方式:
- Scalar(a, b, c):省略透明通道,由於OpenCV的彩色影像通常為BGR的順序,a代表藍色、b代表綠色、c代表紅色。
- Scalar(a):通常用於灰階圖,像素強度為a。
openCV 图像相加,位运算,协方差,绝对值,比较
原文:http://blog.csdn.net/Dr_Neo/article/details/44107269
(1)基本运算
两图像相加:
add(InputArray src1,InputArray src2, OutputArray dst, InputArray mask=noArray(),int dtype=-1):如可用add(A,B,C)来计算C=A+B;如果指定了图像掩模mask(注:mask必须为单通道),则运算只在mask对应像素部位null的像素上进行,add(A,B,C,mask)意为if(mask[i]0)c[i]=a[i]+b[i];
addWeighted(InputArray src1,double alpha, InputArray src2, double beta, double gamma,OutputArraydst, int dtype=-1):计算加权和,如addWeighted(A,k1,B,k2,k3,C)表示C=k1*A+k2*B+k3;
scaleAdd(A,k1,B,C)表示C=k1*A+B
减:subtract(A,B,C)表示C=A-B
乘:mutiply(A,B,C,k)表示C=k*A*B
divide(InputArray src1,InputArray src2, OutputArray dst, double scale=1,int dtype=-1):除法,divide(A,B,C,k)表示C=(A*k/B);也可以直接用一个scale来除以array,divide(k,B,C)表示C=k/B
当然还有其他计算符,如log()、exp()
位运算:
bitwise_and(InputArray src1,InputArray src2, OutputArray dst, InputArray mask=noArray()):按位与,bitwise_and(A,B,C,mask)表示if(mask[i])a[i]^b[i]=c[i]
bitwise_not(A,B,mask):按位非,b[i] =~a[i]
bitwise_or(A,B,C):按位或,C=AB
bitewise_xor(A,B,C):按位异或,C=AB
此处需要注意的是,所有这些运算都会调用cv::saturate_cast函数来进行截断操作,以保证输出像素值都在合理的范围之内。另外,OpenCV对c++的很多操作符都进行了重载,所以可以直接使用运算符+,=,*,/,&,|,~,^,<,>等来对图像矩阵进行操作,矩阵求逆m.inv(),矩阵转置m.t(),行列式m.determinant(),向量模v.norm(),向量叉乘v1.cross(v2),向量点积v1.dot(v2)
(2)矩阵操作
calcCovarMatrix():计算协方差矩阵
invert(InputArray src,OutputArray dst, int flags=DECOMP_LU):求逆矩阵
sqrt(InputArray src,OutputArray dst):计算平方根
求绝对值:
abs(const Mat& m):求绝对值,输入参数可是矩阵也可是表达式,如:C=abs(A),C=abs(A-B)
absdiff(InputArray src1,InputArray src2, OutputArray dst):absdiff(A,B,C)等价于C=abs(A-B)
cartToPolar(InputArray x, InputArray y,OutputArray magnitude, OutputArray angle, boolangleInDegrees=false):计算二维矢量的幅值和向角
dct(InputArray src,OutputArray dst, int flags=0):离散余弦变换
dft(InputArray src,OutputArray dst, int flags=0, int nonzeroRows=0):离散傅里叶变换
flip(InputArray src,OutputArray dst, int flipCode):对图像进行翻转,flipCode>0,进行垂直翻转;flipCode=0,进行水平翻转;flipCode<0,同时进行水平、垂直翻转;
(3)比较操作
CheckRange():用来判断输入array中的每个元素是否都处于某一范围内
compare(InputArray A, InputArray B,OutputArray C, int cmpop):根据参数cmpop的值来决定A和B比较的方式,其值有CMP_EQ,CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE,结果输出为C;
min():如C=min(A,B)表示c[i]=min(a[i],b[i])
max():与min()类似
注意,此处所有函数在调用时都要加上命名空间cv::
opencv里面,基本上矩阵、向量能想到的操作都有相对应的函数,非常之多,在此不能一一列出,具体的在opencv的online documentation里面都有。建议大家在实际编程时,遇到跟矩阵相关的运算、操作时都先去查阅一下opencv的online documentation,要是里面有现成的函数就可以直接调用了,没有的再去自己想办法写。有关矩阵操作符的库函数主要集中在opencv_core模块中。
经过我多次实验的出结论:opencv中求得的协方差矩阵比matlab中的大(n-1)倍!(n是矩阵的行数)