OpenCV 矩阵操作 CvMat
每回用矩阵都要查,这回查到一个比较正确齐全的,放在自己的博客上以后可查
  • 综述:

    • OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.
    • OpenCV将向量作为1维矩阵处理.
    • 矩阵按行存储,每行有4字节的校整.
  • 分配矩阵空间:
    CvMat* cvCreateMat(int rows, int cols, int type);
    
    type: 矩阵元素类型. 格式为CV_<bit_depth>(S|U|F)C<number_of_channels>. 例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.
    例程: CvMat* M = cvCreateMat(4,4,CV_32FC1);
  • 释放矩阵空间:
    CvMat* M = cvCreateMat(4,4,CV_32FC1); cvReleaseMat(&M);
  • 复制矩阵:
    CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
    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);
  • 初始化矩阵为单位阵:
    CvMat* M = cvCreateMat(4,4,CV_32FC1); cvSetIdentity(M); // 这里似乎有问题,不成功

存取矩阵元素

  • 假设需要存取一个2维浮点矩阵的第(i,j)个元素.
  • 间接存取矩阵元素:
  • cvmSet(M,i,j,2.0); // Set M(i,j) t = cvmGet(M,i,j); // Get M(i,j)
  • 直接存取,假设使用4-字节校正:
    CvMat* M = cvCreateMat(4,4,CV_32FC1); int n = M->cols; float *data = M->data.fl; data[i*n+j] = 3.0;
  • 直接存取,校正字节任意:
    CvMat* M = cvCreateMat(4,4,CV_32FC1);
    int step = M->step/sizeof(float);
    float *data = M->data.fl; (data+i*step)[j] = 3.0;
  • 直接存取一个初始化的矩阵元素:
    double a[16]; CvMat Ma = cvMat(3, 4, CV_64FC1, a); a[i*4+j] = 2.0; // Ma(i,j)=2.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
  • 向量乘积:
    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 -> Vc end{verbatim}

    注意 Va, Vb, Vc 在向量积中向量元素个数须相同.

  • 单矩阵操作:
    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
  • 非齐次线性系统求解:
    CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* x = cvCreateMat(3,1,CV_32FC1); CvMat* b = cvCreateMat(3,1,CV_32FC1); cvSolve(&A, &b, &x); // solve (Ax=b) for x
  • 特征值分析(针对对称矩阵):
    CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* E = cvCreateMat(3,3,CV_32FC1); CvMat* l = cvCreateMat(3,1,CV_32FC1); cvEigenVV(&A, &E, &l); // l = A的特征值 (降序排列)
    // E = 对应的特征向量 (每行)
  • 奇异值分解SVD:
    CvMat* A = cvCreateMat(3,3,CV_32FC1); CvMat* U = cvCreateMat(3,3,CV_32FC1); CvMat* D = cvCreateMat(3,3,CV_32FC1); CvMat* V = cvCreateMat(3,3,CV_32FC1); cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T

    标号使得 U 和 V 返回时被转置(若没有转置标号,则有问题不成功!!!).

访问CvMat数据块(矩阵维度与通道)

通过opencv的函数来访问矩阵的数据
 
cvGet*D,cvSet*D
 
cvGetReal1D, cvGetReal2D, cvGetReal3D, cvGetRealND
cvGet1D, cvGet2D, cvGet3D, cvGetND
cvSet*D,也有相应的函数系列
这些函数的缺点是,效率低
 
Real表示对单通道矩阵的访问,没有Real的表示对多通道矩阵的访问
 
从数据创建矩阵
 
 //数据
                 float data[18] =
                {
                                30,60,40,60, 50,40,
                                67,88,55,33, 22,97,
                                59,69,32,46, 25,45
                };
 
(1)单通道,可以想象有这样一个矩阵
 
(2)双通道(理解为一个元素包含两个数字)
 
 
可以理解为这样一个矩阵
二通道矩阵可以理解为拆分为两个单通道的矩阵
 

(3)三通道

维 体现为它的坐标
 
代码:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
//#include "cxtypes.h"
 
int main(int argc, char* argv[])
{
                 //数据
                 float data[18] =
                {
                                30,60,40,60, 50,40,
        67,88,55,33, 22,97,
        59,69,32,46, 25,45
                };
 
                CvMat mat;
                 //三行六列单通道
                 //cvInitMatHeader(&mat,3,6,CV_32FC1,data);
                 //三行三列双通道
                 //cvInitMatHeader(&mat,3,3,CV_32FC2,data);
                 //三行二列三通道
                cvInitMatHeader(&mat,3,2,CV_32FC3,data);
 
                 
 
                 for (int y=0;y<mat.rows;y++)
                {
                                 for (int x=0;x<mat.cols;x++)
                                {
                                                 //取矩阵里面的行列
                                                 //float value = cvGetReal2D(&mat,y,x);
                                                CvScalar value = cvGet2D(&mat,y,x);
                                                 //CvScalar value = cvGetReal3D(&mat,z,y,x);
                                                printf( "(%f  %f  %f) " ,value.val[0],value.val[1],value.val[2]);
                                }
                                printf( "\n" );
                }
 
                 return 0;
}

opencv矩阵总结的更多相关文章

  1. opencv 矩阵操作

    OpenCv矩阵操作 有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等 大多数函数支持ROI,如果图像ROI被设置,那么只处 ...

  2. opencv矩阵操作

    1.初始化矩阵: 方式一.逐点赋值式: CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 ); cvZero( mat ); cvmSet( mat, 0, 0, 1 ...

  3. opencv 矩阵的相似性对比 (图片之间比较)

    测试图片:     code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\c ...

  4. OpenCV —— 矩阵和图像操作

    cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include ...

  5. OpenCV —— 矩阵操作

    多通道的矩阵 —— 通道是连续的!! 要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1.如果想访问下一个“像素”或者元素集,则需要一定的偏移量 矩阵的step元素是矩阵中行的长度,单位为字 ...

  6. openCV 矩阵(图像)操作函数

    有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等.大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分 少部分函 ...

  7. opencv 矩阵类数据的运算

    参考:http://blog.sina.com.cn/s/blog_7908e1290101i97z.htmlhttp://blog.sina.com.cn/s/blog_afe2af380101bq ...

  8. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  9. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问

        老板让让做一个东东.输入端要用到opencv顺便就来学习一下.买了本书<学习opencv>翻来一看,opencv1.0,去官网上一看.opencv2.49,瞬间有种蛋碎的赶脚.看着 ...

随机推荐

  1. 手机app常见bug积累

    经过一年的测试工作,以下是手机APP比较容易出现的错误.之后如果发现了还会继续添加,修改.1.翻页手机客户端,内容超过一页时,上拉加载更多内容,加载错误(容易出现数据重复,图片和文章不匹配,图片重复加 ...

  2. swift语言开发的一个游戏------熊猫跑酷(KongfuPanda)

    项目地址:https://github.com/jakciehoo/KongfuPanda 欢迎加QQ群:260558552.大家一起交流iOS开发,我们可以一起学习,我很想集结一些志同道合的朋友,一 ...

  3. 在iis6.0公布asp.net mvc3网站

    在iis6.0发布asp.net mvc3网站 这个问题一直困扰了我很长一段时间,终于在今天综合网上查的资料把它解决了. 在iis6.0发布asp.net mvc3网站 1   需要在服务器下安装.n ...

  4. linux下文件系统的介绍

    一.linux文件系统的目录结构 目录 描述 / 根目录 /bin 做为基础系统所需要的最基础的命令就是放在这里.比如 ls.cp.mkdir等命令:功能和/usr/bin类似,这个目录中的文件都是可 ...

  5. 《day18_String练习_基本类型包装类_集合入门》

    package cn.itcast.api.String.test; public class StringTest_1 { public static void main(String[] args ...

  6. 【Tsinghua OJ】范围查询(Range)问题

    [问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...

  7. Cocos2d-x 2.x项目创建

    cocos2d-x下载地址:http://www.cocos2d-x.org/download 2.0之后的创建项目 1. cd cocos2d-x-2.2.1/tools/project-creat ...

  8. HDU 4869 (递推 组合数取模)

    Problem Turn the pokers (HDU 4869) 题目大意 有m张牌,全为正面朝上.进行n次操作,每次可以将任意ai张反面,询问n次操作可能的状态数. 解题分析 记正面朝上为1,朝 ...

  9. Unity3D 创建动态的立方体图系统

    Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...

  10. VS2010命令行编译C#和VC项目

    VS2010命令行编译C#和VC项目 VS2010命令行编译C#和VC项目 根据需要动态创建数据库字段后,需要动态创建或者调整页面,那就需要编译这些页面和后台文件.因此使用命令行编译将会非常方便,对于 ...