opencv矩阵运算

news/2024/7/3 13:11:58 标签: vb, float, 语言, 存储, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
color:#084487">ckground-color:rgb(255,255,255)">
class="blogzz_acon" style="line-height:21px; text-align:left">

color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial"> ckground-color:rgb(255,255,255)">                                               opencv矩阵运算

color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">  

color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">

color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">  综述


    color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">
    • color:initial; list-style-type:none; list-style-position:initial">
    • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">OpenCV有针对矩阵操作的Cclass="tags" href="/tags/YuYan.html" title=语言>语言函数. 许多其他方法提供了更加方便的C++接口࿰c;其效率与OpenCV一样.
    • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">OpenCV将向量作为1维矩阵处理.
    • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">矩阵按行class="tags" href="/tags/CunChu.html" title=存储>存储࿰c;每行有4字节的校整.


    • color:initial; list-style-type:none; list-style-position:initial">
    • color:initial; list-style-type:disc; list-style-position:initial"> 分配矩阵空间:
    • color:initial; list-style-type:disc; list-style-position:initial"> ce; white-space:pre">CvMat* cvCreateMat(int rows, int cols, int type);
  • color:initial; list-style-type:disc; list-style-position:initial">
    ckground-color:rgb(255,255,255)">type: 矩阵元素类型. 格式为CV_<bit_depth>(S|U|F)C<number_of_channels>. 例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.
    例程: CvMat* M = cvCreateMat(4,4,CV_32FC1);
    ckground-color:rgb(255,255,255)">
    
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">释放矩阵空间:
    ckground-color:rgb(255,255,255)">CvMat* M = cvCreateMat(4,4,CV_32FC1);
    ckground-color:rgb(255,255,255)">cvReleaseMat(&M);
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">复制矩阵:
    ckground-color:rgb(255,255,255)">CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
    CvMat* M2;
    M2=cvCloneMat(M1);
    ckground-color:rgb(255,255,255)">
    
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">初始化矩阵:
    ckground-color:rgb(255,255,255)">double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    CvMat Ma=cvMat(3, 4, CV_64FC1, a);
    ckground-color:rgb(255,255,255)">
    另一种方法:
    ckground-color:rgb(255,255,255)">CvMat Ma; cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
    ckground-color:rgb(255,255,255)">
    
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">初始化矩阵为单位阵:
    ckground-color:rgb(255,255,255)">CvMat* M = cvCreateMat(4,4,CV_32FC1); 
    ckground-color:rgb(255,255,255)">cvSetIdentity(M); // 这里似乎有问题࿰c;不成功
    ckground-color:rgb(255,255,255)">
    
    ckground-color:rgb(255,255,255)">
    

color:initial; list-style-type:none; list-style-position:initial"> ckground-color:rgb(255,255,255)">存取矩阵元素

    color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">假设需要存取一个2维浮点矩阵的第(i,j)个元素.
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">间接存取矩阵元素:
  • color:initial; list-style-type:disc; list-style-position:initial">
    ckground-color:rgb(255,255,255)">cvmSet(M,i,j,2.0); // Set M(i,j) t = cvmGet(M,i,j); // Get M(i,j)
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">直接存取࿰c;假设使用4-字节校正:
    ckground-color:rgb(255,255,255)">CvMat* M = cvCreateMat(4,4,CV_32FC1); 
    ckground-color:rgb(255,255,255)">int n = M->cols; 
    ckground-color:rgb(255,255,255)">class="tags" href="/tags/FLOAT.html" title=float>float *data = M->data.fl;ckground-color:rgb(255,255,255)"> 
    ckground-color:rgb(255,255,255)">data[i*n+j] = 3.0;
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">直接存取࿰c;校正字节任意:
    ckground-color:rgb(255,255,255)">CvMat* M = cvCreateMat(4,4,CV_32FC1);
    int step = M->step/sizeof(class="tags" href="/tags/FLOAT.html" title=float>float);
    class="tags" href="/tags/FLOAT.html" title=float>float *data = M->data.fl;
    (data+i*step)[j] = 3.0;
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">直接存取一个初始化的矩阵元素:
    ckground-color:rgb(255,255,255)">double a[16]; 
    ckground-color:rgb(255,255,255)">CvMat Ma = cvMat(3, 4, CV_64FC1, a); 
    ckground-color:rgb(255,255,255)">a[i*4+j] = 2.0; // Ma(i,j)=2.0;
    ckground-color:rgb(255,255,255)">
    

color:initial; list-style-type:none; list-style-position:initial"> ckground-color:rgb(255,255,255)">矩阵/向量操作

    color:rgb(8,68,135); margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">矩阵-矩阵操作:
    ckground-color:rgb(255,255,255)">CvMat *Ma, *Mb, *Mc;ckground-color:rgb(255,255,255)"> 
    ckground-color:rgb(255,255,255)">cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc 
    ckground-color:rgb(255,255,255)">cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc 
    ckground-color:rgb(255,255,255)">cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">按元素的矩阵操作:
    ckground-color:rgb(255,255,255)">CvMat *Ma, *Mb, *Mc
    ckground-color:rgb(255,255,255)">cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc 
    ckground-color:rgb(255,255,255)">cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc 
    ckground-color:rgb(255,255,255)">cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">向量乘积:
    ckground-color:rgb(255,255,255)">double va[] = {1, 2, 3}; 
    ckground-color:rgb(255,255,255)">double class="tags" href="/tags/VB.html" title=vb>vb[] = {0, 0, 1}; 
    ckground-color:rgb(255,255,255)">double vc[3];
    CvMat Va=cvMat(3, 1, CV_64FC1, va); 
    ckground-color:rgb(255,255,255)">CvMat Vb=cvMat(3, 1, CV_64FC1, class="tags" href="/tags/VB.html" title=vb>vb); 
    ckground-color:rgb(255,255,255)">CvMat Vc=cvMat(3, 1, CV_64FC1, vc);
    double res=cvDotProduct(&Va,&Vb); // 点乘: Va . Vb -> res 
    ckground-color:rgb(255,255,255)">cvCrossProduct(&Va, &Vb, &Vc); // 向量积: Va x Vb -> Vc end{verbatim}

    color:initial; list-style-type:none; list-style-position:initial; word-wrap:normal; word-break:normal"> ckground-color:rgb(255,255,255)">注意 Va, Vb, Vc 在向量积中向量元素个数须相同.

    color:initial; list-style-type:none; list-style-position:initial; word-wrap:normal; word-break:normal"> ckground-color:rgb(255,255,255)">

  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">单矩阵操作:
    ckground-color:rgb(255,255,255)">CvMat *Ma, *Mb; 
    ckground-color:rgb(255,255,255)">cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (不能对自身进行转置) 
    ckground-color:rgb(255,255,255)">CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0] 
    ckground-color:rgb(255,255,255)">double d = cvDet(Ma); // det(Ma) -> d 
    ckground-color:rgb(255,255,255)">cvInvert(Ma, Mb); // inv(Ma) -> Mb
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">非齐次线性系统求解:
    ckground-color:rgb(255,255,255)">CvMat* A = cvCreateMat(3,3,CV_32FC1);
    ckground-color:rgb(255,255,255)"> CvMat* x = cvCreateMat(3,1,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* b = cvCreateMat(3,1,CV_32FC1); 
    ckground-color:rgb(255,255,255)">cvSolve(&A, &b, &x); // solve (Ax=b) for x
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">特征值分析(针对对称矩阵):
    ckground-color:rgb(255,255,255)">CvMat* A = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* E = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* l = cvCreateMat(3,1,CV_32FC1); 
    ckground-color:rgb(255,255,255)">cvEigenVV(&A, &E, &l); // l = A的特征值 (降序排列)
                           // E = 对应的特征向量 (每行)
    ckground-color:rgb(255,255,255)">
    
  • color:initial; list-style-type:disc; list-style-position:initial"> ckground-color:rgb(255,255,255)">奇异值分解SVD:
    ckground-color:rgb(255,255,255)">CvMat* A = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* U = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* D = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">CvMat* V = cvCreateMat(3,3,CV_32FC1); 
    ckground-color:rgb(255,255,255)">cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T

    color:initial; list-style-type:none; list-style-position:initial; word-wrap:normal; word-break:normal"> ckground-color:rgb(255,255,255)">标号使得 U 和 V 返回时被转置(若没有转置标号࿰c;则有问题不成功!!!).


cle>

http://www.niftyadmin.cn/n/790955.html

相关文章

使用apt-get出现“Could not get lock...”的解决方法

使用apt-get 安装软件的时候出现以下错误 -------------------------------------------------------------------------------------------------------------- $ sudo apt-get install hostapd E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily u…

uname -a输出内容分析

虽然很早就会用这条命令了&#xff0c;但一直都不知道输出的各部分表示什么&#xff0c;如下&#xff1a; ---------------------------------------------------------------------------- $ uname -a Linux ubuntu3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:4…

OpenCV随机方法使用

OpenCV也提供了另一个数据结构来做Rand的实作,CvRandState,被包在"cvcompat.h"里,"cvcompat.h"的完整意 思是Computer Vision Compatility,CvRandState的特色是可以选定常态分布及均匀分布,不过,它只能运用在矩阵跟一维数组. 矩阵的部份程序代码如下 Ran…

对RSA和AES的理解

原文地址&#xff1a;https://blog.csdn.net/huanhuanq1209/article/details/80614271 1、RSA和AES的区别&#xff1a; 总结于&#xff1a;http://www.360doc.com/content/16/0606/15/12385684_565529546.shtml# RSA&#xff1a; 是公开密钥系统的代表&#xff1b; 安全性&…

判断Linux系统是32位还是64位

方法1&#xff1a; 执行以下命令&#xff1a; --------------------------- $ getconf LONG_BIT --------------------------- 如果输出32即为32位系统&#xff0c;输出64即为64位系统 方法2&#xff1a; 执行以下命令&#xff1a; --------------------------- $ unam…

opencv中关于直方图的相关函数

直方图   CvHistogram 多维直方图 typedef struct CvHistogram { int header_size; CvHistType type; int flags; int c_dims; int dims[CV_HIST_MAX_DIM]; int mdims[CV_HIST_MAX_DIM]; float* thresh[CV_HIST_MAX_DIM]; float* array; struct CvNode* root; CvSet* …

pthread_create如何传递两个参数以上的参数

涉及多参数传递给线程的&#xff0c;都需要使用结构体将参数封装后&#xff0c;将结构体指针传给线程 定义一个结构体 struct mypara { var para1;//参数1 var para2;//参数2 } 将这个结构体指针&#xff0c;作为void *形参的实际参数传递 struct mypara pstr…

Manifest 添加 FileProvider 报错:Manifest merger failed with multiple errors, see logs

报错&#xff1a; Error:Execution failed for task :app:processDebugManifest. > Manifest merger failed with multiple errors, see logs 代码&#xff1a; <providerandroid:name"android.support.v4.content.FileProvider"android:authorities"al…