Opencv矩阵操作

分配矩阵空间:

CvMat* cvCreateMat(int rows, int cols, int type);

释放矩阵空间:

cvReleaseMat(&M);

数据类型宏定义:

CV_<bit_depth>(S|U|F)C<number_of_channels>

复制矩阵

CvMat* M2;    M2=cvCloneMat(M1);

初始化矩阵:

double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

要么

CvMat Ma=cvMat(3, 4, CV_64FC1, a);

或者

CvMat Ma;

cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);

间接存取矩阵元素:

cvmSet(M,i,j,2.0);

t = cvmGet(M,i,j);

直接存取,校正字节任意:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

int step = M->step/sizeof(float);

float *data = M->data.fl;

(data+i*step)[j] = 3.0;

矩阵间的运算:

CvMat *Ma, *Mb, *Mc;
cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc
cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc
cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc

矩阵元素间的运算

CvMat *Ma, *Mb, *Mc;
cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc
cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc
cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc

单矩阵操作:

CvMat *Ma, *Mb;
cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (不能对自身进行转置)
CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]
double d = cvDet(Ma); // det(Ma) -> d
cvInvert(Ma, Mb); // inv(Ma) -> Mb

向量乘积:

double va[] = {1, 2, 3};
double vb[] = {0, 0, 1};
double vc[3];
CvMat Va=cvMat(3, 1, CV_64FC1, va);
CvMat Vb=cvMat(3, 1, CV_64FC1, vb);
CvMat Vc=cvMat(3, 1, CV_64FC1, vc);
double res=cvDotProduct(&Va,&Vb); // 点乘:Va . Vb -> res
cvCrossProduct(&Va, &Vb, &Vc); // 向量积: Va x Vb -> Vcend{verbatim}
时间: 2024-12-29 23:23:38

Opencv矩阵操作的相关文章

OpenCV &mdash;&mdash; 矩阵操作

多通道的矩阵 -- 通道是连续的!! 要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1.如果想访问下一个"像素"或者元素集,则需要一定的偏移量 矩阵的step元素是矩阵中行的长度,单位为字节.   #include "cv.h" #include "highgui.h" #include <IOSTREAM.H> int main(int argc,char** argv) { float vals[]={0.85,-0.

OpenCV &mdash;&mdash; 矩阵和图像操作

cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include <highgui.h> int main(int argc,char** argv) { IplImage *s1,*s2; s1=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_COLOR); s2=cvLoadImage("test.

[opencv]像素操作的数字图像处理

之前几天捣鼓matlab,用来处理数字图像,矩阵操作什么的,如果忘记线性代数就真的GG了. 在用了matlab被深深地吐槽之后,决定改用opencv,C++貌似也是处理数字图像的很好的工具 1. 在ubuntu上安装opencv 教程可以百度之,都很详细的 2. 像素处理图像: (1)根据输入的数据,用邻近取样插值法,缩放图像 邻近取样插值法原理:http://blog.chinaunix.net/uid-27675161-id-3452025.html   (2)根据输入,改变数字图像的灰度分

OpenCV—基本矩阵操作与示例

OpenCV的基本矩阵操作与示例 OpenCV中的矩阵操作非常重要,本文总结了矩阵的创建.初始化以及基本矩阵操作,给出了示例代码,主要内容包括: 创建与初始化 矩阵加减法 矩阵乘法 矩阵转置 矩阵求逆 矩阵非零元素个数 矩阵均值与标准差 矩阵全局极值及位置 其他矩阵运算函数列表 1. 创建矩阵 1.1 数据类型 建立矩阵必须要指定矩阵存储的数据类型,图像处理中常用的几种数据类型如下: CV_8UC1// 8位无符号单通道 CV_8UC3// 8位无符号3通道 CV_8UC4 CV_32FC1//

iOS开发UI篇—Quartz2D使用(矩阵操作)

iOS开发UI篇-Quartz2D使用(矩阵操作) 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 //画四边形 4 //获取图形上下文 5 CGContextRef ctx=UIGraphicsGetCurrentContext(); 6 //绘图 7 CGContextAddRect(ctx, CGRectMake(20, 50, 100, 100)); 8 //渲染

poj3735—Training little cats(特殊操作转化为矩阵操作)

题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2. e i 让第i只猫咪吃光它的花生 3. s i j 交换猫咪i与猫咪j的花生 现将上述一组连续操作做m次后,求每只猫咪有多少颗花生? 思路:这道题难点在如何把这种奇怪的操作转化为矩阵操作,网络上看到一个画的很好的图,这里直接偷过来. 现在,对于每一个操作我们都可以得到一个转置矩阵,把k个操作的矩

matlab矩阵操作

1:求行数  nrow=size(matrix,1); 2:求列数  ncol=size(matrix,2); 3:矩阵合并 c1=[m1,m2]横向合并  c2=[m1;m2]纵向合并 m1= [5     2     3] ; m2=[1     2     3]; c1 =[5     2     3     1     2     3]; c2 =[ 5 2 3 1 2 3 ] matlab的下标从1开始,取matlab的元素直接用m[index]即可 取子矩阵 m[r1:rn,:]  

避免使用循环的几个高效matlab矩阵操作

matlab拥有强大的晕针运算能力,下面的几个例子展示了很多在其他语言中需要用循环遍历才能完成的操作在matlab里可以用矩阵操作来完成 1)将矩阵中小于零的元素置零: a = [1,2,3;-1,-2,-3;1,0,-1] a(a<0) = 0 打印结果: a = 1 2 3 -1 -2 -3 1 0 -1 a = 1 2 3 0 0 0 1 0 0 2)将矩阵a中小于0的元素乘以2,其他元素不改变值: a = [1,2,3;-1,-2,-3;1,0,-1] a(find(a<0)) = a

图形上下文的矩阵操作(平移-缩放-旋转)

图形上下文的矩阵操作(旋转.缩放和平移) CGContextRotateCTM:图形上下文旋转,以上下文的原点(左上角)为基准 CGContextScaleCTM:图形上下文的缩放,以上下文的原点(左上角)为基准 CGContextTranslateCTM:图形上下文的平移,以上下文的原(左上角)点为基准 注意:一定要在添加路径之前进行设置 下面贴出swift版代码: 1 override func draw(_ rect: CGRect) { 2 let context = UIGraphic