opencv矩阵运算(2)

简单介绍

  本篇承接上一篇。继续opencv下矩阵计算的函数使用。

计算矩阵的逆

  注意:矩阵A是可逆矩阵的充分必要条件是行列式detA不等于0。

详细代码

double x[3][3] = {{1, 2, 3}, {2, 2, 1}, {3, 4, 3}};
double y[3][3] = {{1, 0, 0}, {0, 2, 0}, {0, 0, 3}};
 
void showMatdate(Mat tmpMat){
	int i, j;
	CvScalar s1;
	Width = tmpMat.rows;
	Height = tmpMat.cols;
	IplImage tmp;
 
	tmp = tmpMat;
 
	for(i=0; i< Width; i++){
		for(j=0; j<Height; j++){
			s1 = cvGet2D(&tmp, i, j);
			printf("%0.1lf  ", s1.val[0]);
		}
		printf("\n");
	}
	printf("\n");
}
 
int main(int argc, char *argv[]){
 
/*************初始化矩阵*****************************/
	mat1 = Mat(3, 3, CV_64FC1, x);
	src1 = mat1;
	mat2 = Mat(3, 3, CV_64FC1, y);
	src2 = mat2;
/*************显示矩阵数据***************************/
	printf("mat1:\n");
	showMatdate(mat1);
 
/*****************矩阵的逆**********************/
	mat3 = Mat(3, 3, CV_64FC1);
	src3 = mat3;
	cvInvert(&src1, &src3);
	showMatdate(mat3);
	return 0;
}

结果显示

      

矩阵元素自然对数

详细代码

/*****************矩阵元素自然对数**********************/
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
    cvLog(&src1, &src3);
    showMatdate(mat3);

结果显示

      

矩阵查找表转换

详细代码

/*****************矩阵查找表转换**×******************/
    uchar lut[256];
 
    mat3 = Mat(3, 3, CV_8UC1);
    src3 = mat3;
    mat1.convertTo(mat1, CV_8UC1);
    src1 = mat1;
    mat2 = cvCreateMatHeader(1, 256, CV_8UC1);
    src2 = mat2;
    for (int i = 0; i < 256; i++) {
        lut[i] = 255 - i;
    }
    cvSetData(&src2, lut, 0);
    cvLUT(&src1, &src3, &src2);
    printf("cvLUT(mat1):\n");
    showMatdate(mat3);
    注意:mat3 = src2[mat1].(假设mat1格式为CV_8U)
          mat3 = src2[mat1 + 128].(假设mat1格式为CV_8S)

结果显示

      

计算向量间马氏距离

详细代码

/*************显示矩阵数据***************************/
    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
/*****************计算向量间马氏距离**********************/
    mat3 = Mat(3, 3, CV_64FC1, z);
    src3 = mat3;
    printf("mat3:\n");
    showMatdate(mat3);
 
    tmp = cvMahalanobis(&src1, &src2, &src3);
    printf("cvMahalanobis(mat1, mat2, mat3): %.1lf\n", tmp);
    马氏距离的定义。參考例如以下:http://blog.csdn.net/jmy5945hh/article/details/20536929

结果显示

      

获得矩阵元素间最大值

详细代码

/*****************计算矩阵參数间最大值**********************/
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
    cvMax(&src1, &src2, &src3);
    printf("cvMax(mat1, mat2):\n");
    showMatdate(mat3);
   类似的还有cvMaxS:计算矩阵元素和參数的最大值。

cvAvg:计算矩阵元素的平均值。

cvAvgSdv:计算矩阵元素的平均值和标准差。

cvMin:计算矩阵參数间最小值。

cvMinS:计算矩阵元素和參数的最小值。

结果显示

      

单通道合成多通道矩阵

详细代码

    mat3 = Mat(1, 3, CV_8UC3);
    src3 = mat3;
    cvMerge(&src1, &src2, 0, 0, &src3);
    printf("cvMax(mat1, mat2):\n");
    showMatdate(mat3);
  相应的函数为:split()(将多通道分离为单通道矩阵)。

获取矩阵最大最小元素

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    cvMinMaxLoc(&src1, &min, &max, &min_p1, &max_p2);
    printf("min:%lf, min_p1.x:%d, min_p1.y:%d\n", min, min_p1.x, min_p1.y);
    printf("max:%lf, max_p2.x:%d, max_p2.y:%d\n", max, max_p2.x, max_p2.y);
     获取到最大最小值:max,min。以及它们的相应位置坐标:min_p1, max_p2。

结果显示

         

两个矩阵傅里叶频谱相乘

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvMulSpectrums(&src1, &src2, &src3, DFT_ROWS);
    printf("mat3:\n");
    showMatdate(mat3);

结果显示

         

矩阵乘法

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvMul(&src1, &src2, &src3, 3);
    printf("cvMul(mat1 * mat2 * 3):\n");
    showMatdate(mat3);

结果显示

         

矩阵和转置的乘积

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvMulTransposed(&src1, &src3, 0, &src2);
    printf("cvMulTransposed(mat1):\n");
    showMatdate(mat3);
    void cvMulTransposed( const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL );
    src:输入矩阵
    dst:目标矩阵
    order:乘法顺序
    delta:一个可选数组, 在乘法之前从 src 中减去该数组。

函数 cvMulTransposed 计算 src 和它的转置的乘积。
函数求值公式:
        假设 order=0
              dst=(src-delta)*(src-delta)T
        否则
              dst=(src-delta)T*(src-delta)

结果显示

        

矩阵绝对差等

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    tmp = cvNorm(&src1, &src2, NORM_L1);
    printf("cvNorm(mat1, mat2, NORM_INF):%lf\n", tmp);
  double cvNorm(const CvArr* arr1, const CvArr* arr2=NULL, int norm_type=CV_L2, const CvArr* mask=NULL )
  假设arr2 == NULL
则:
    
否则:
      
   或者
      

结果显示

     

极性坐标转换到笛卡尔坐标

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 1, CV_64FC1);
    src3 = mat3;
    mat4 = Mat(3, 1, CV_64FC1);
    src4 = mat4;
 
    cvPolarToCart(&src1, &src2, &src3, &src4, true);
    printf("cvPolarToCart(mat1, mat2)--x:\n");
    showMatdate(mat3);
    printf("cvPolarToCart(mat1, mat2)--y:\n");
    showMatdate(mat4);
  void cvPolarToCart(const CvArr* magnitude, const CvArr* angle, CvArr* x, CvArr* y, int angle_in_degrees=0)
  magnitude:极坐标的长度。

angle:极坐标的角度。
  x:笛卡尔X坐标。

y:笛卡尔Y坐标。
  angle_in_degrees:若为true,表示输入的是角度,否则表示输入的是弧度。

结果显示

   

矩阵元素求幂

详细代码

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 1, CV_64FC1);
    src3 = mat3;
 
    cvPow(&src1, &src3, 2);
    printf("cvPow(mat1, 2):\n");
    showMatdate(mat3);

结果显示

   

矩阵简化为向量

详细代

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 1, CV_64FC1);
    src3 = mat3;
 
    cvReduce(&src1, &src3, 1, CV_REDUCE_MAX);
    printf("cvReduce(mat1, 1 , CV_REDUCE_MAX):\n");
    showMatdate(mat3);
  void cvReduce(const CvArr* src, CvArr* dst, int dim=-1, int op=CV_REDUCE_SUM)
  src:待简化的矩阵。
  dst:生成的向量。
  dim:0意味着矩阵被处理成一行,1意味着矩阵被处理成为一列,-1时维数将依据输出向量的大小自己主动选择.
  op:
       CV_REDUCE_SUM-输出是矩阵的全部行/列的和.
       CV_REDUCE_AVG-输出是矩阵的全部行/列的平均向量.
       CV_REDUCE_MAX-输出是矩阵的全部行/列的最大值.
       CV_REDUCE_MIN-输出是矩阵的全部行/列的最小值.

结果显示

   
时间: 2024-12-14 05:44:23

opencv矩阵运算(2)的相关文章

opencv矩阵运算(1)

简介 在机器学习中,经常需要用到矩阵计算.因此从本篇开始整理下opencv实现的矩阵计算相关函数使用. 矩阵初始化 具体代码 这里初始化了两个3X3矩阵,并将它的数据显示出来: double x[3][3] = {{1, 50, -100}, {1, -110, 220}, {-1, 150, 150}}; double y[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};   void showMatdate(Mat tmpMat){ int i, j; C

opencv矩阵运算(3)

简介 本篇承接上一篇,继续opencv下矩阵计算的函数使用. 矩阵复制 具体代码 printf("mat1:\n"); showMatdate(mat1);   mat3 = Mat(3, 3, CV_64FC1); src3 = mat3;   cvRepeat(&src1, &src3); printf("cvRepeat(mat1):\n"); showMatdate(mat3); 结果显示 矩阵比例相加 具体代码 printf("m

OpenCV矩阵运算

矩阵处理 1.矩阵的内存分配与释放 (1) 总体上: OpenCV 使用C语言来进行矩阵操作.不过实际上有很多C++语言的替代方案可以更高效地完成. 在OpenCV中向量被当做是有一个维数为1的N维矩阵. 矩阵按行-行方式存储,每行以4字节(32位)对齐. (2) 为新矩阵分配内存: CvMat* cvCreateMat(int rows, int cols, int type); type: 矩阵元素类型. 按CV_<bit_depth>(S|U|F)C<number_of_chann

opencv中相关的矩阵运算

一.矩阵Mat I,img,I1,I2,dst,A,B;double k,alpha;Scalar s;1.加法I=I1+I2;//等同add(I1,I2,I);add(I1,I2,dst,mask,dtype);scaleAdd(I1,scale,I2,dst);//dst=scale*I1+I2;2.减法absdiff(I1,I2,I);//I=|I1-I2|;A-B;A-s;s-A;-A;subtract(I1,I2,dst);3.乘法I=I.mul(I);//点乘,I.mul(I,3);

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组

[转] Matlab与C++混合编程,添加OpenCV库

原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法 调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考

opencv

OpenCV是Intel公司开发的图像处理和计算机视觉函数库,它有以下特点: 1) 开放C源码 2) 基于Intel处理器指令集开发的优化代码 3) 统一的结构和功能定义 4) 强大的图像和矩阵运算能力 5) 方便灵活的用户接口 6)同时支持MS-WINDOWS.LINUX平台 作为一个基本的计算机视觉.图像处理和模式识别的开源项目,OPENCV可以直接应用于很多领域,作为第二次开发的理想工具.不过在利用OPENCV做商业开发应用前,请仔细阅读OPENCV包所附带的 PUBLIC LICENSE

OpenCV 3 最新模块一次看个够

OpenCV 3 的改动在哪? C 风格的API很快将会消失,完全被C++的API替代,代码更加简洁.不易出错.读者如果想借助opencv最新的功能,记得清理代码中的C风格API. C++ API 将更加简洁. 所有的算法都将继承自 cv::Algorithm 接口. 大型的模块将拆分为小模块,模块将在后面继续讲解. OpenCV 3 有这么多文件夹,从何入手? 3rdparty/,包含第三方的库,比如视频解码用的 ffmpeg,jpg.png.tiff等图片的开源解码库. apps/,包含进行

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效