opencv矩阵运算(1)
2015-08-25 16:41
447 查看
从本篇开始整理下opencv实现的矩阵计算相关函数使用。
矩阵初始化
具体代码
这里初始化了两个3X3矩阵,并将它的数据显示出来:
<pre name="code" class="cpp">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; 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\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); printf("mat2:\n"); showMatdate(mat2); return 0; }
结果显示
矩阵绝对值之差
具体代码
<pre name="code" class="cpp">/*************两个矩阵绝对值之差*********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvAbsDiff(&src1, &src2, &src3); printf("cvAbsDiff(mat1, mat2):\n"); showMatdate(mat3);
结果显示
矩阵与数值差的绝对值
具体代码
<pre name="code" class="cpp">/*************矩阵与数值差的绝对值*******************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvAbsDiffS(&src1, &src3, Scalar(5)); printf("cvAbsDiffS(mat1, 5):\n"); showMatdate(mat3);
结果显示
矩阵相加
具体代码
<pre name="code" class="cpp">/************两个矩阵相加***************************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvAdd(&src1, &src2, &src3); printf("cvAdd(mat1, mat2):\n"); showMatdate(mat3);
结果显示
矩阵权重相加
具体代码
<pre name="code" class="cpp">/**********两个矩阵以权重形式相加******************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvAddWeighted(&src1, 0.5, &src2, 0.5, 3, &src3); printf("cvAddWeighted(mat1, 0.5,mat2, 0.5, 3):\n"); showMatdate(mat3);
计算公式为:src3 = src1 * 0.5 + src2 * 0.5 + 3;
结果显示
矩阵的与计算
具体代码
<pre name="code" class="cpp">/*******************矩阵与计算********************** *******可以使用掩码来决定计算被的数据元素********* *******对应的还有cvNot cvOr cvXor *****************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvAnd(&src1, &src2, &src3); printf("cvAnd(mat1, mat2):\n"); showMatdate(mat3);
结果显示
矩阵比较
具体代码
<pre name="code" class="cpp">/******************两个矩阵比较********************/ int tmp = CMP_EQ; mat3 = Mat(3, 3, CV_8UC1); src3 = mat3; mat1.convertTo(mat1, CV_8UC1); mat2.convertTo(mat2, CV_8UC1); cvCmp(&src1, &src2, &src3, tmp); printf("cvCmp(mat1, mat2):\n"); showMatdate(mat3);
需要先把mat1和mat2转换为格式CV_8UC1,然后室友函数cvCmp进行比较。注意cvCmp的flag标志,本例使用的是相等:CMP_EQ,也就是将mat1和mat2 矩阵对应位置的数值比较,如果相等,则mat3对应位置数值设置为255,否则设置为0。 对应的flag有:
<pre name="code" class="cpp">CMP_EQ src1 is equal to src2. CMP_GT src1 is greater than src2. CMP_GE src1 is greater than or equal to src2. CMP_LT src1 is less than src2. CMP_LE src1 is less than or equal to src2. CMP_NE src1 is unequal to src2.
结果显示
计算矩阵绝对值
具体代码
<pre name="code" class="cpp">/******************计算绝对值************************/ mat3 = Mat(3, 3, CV_8UC1); src3 = mat3; cvConvertScaleAbs(&src1, &src3, 0.5, 4); printf("cvConvertScaleAbs(mat1, 0.5, 4):\n"); showMatdate(mat3); 注意:mat3 = | mat1 * 0.5 + 4 |;
结果显示
计算矩阵非0元素个数
具体代码
<pre name="code" class="cpp">/****************计算矩阵非0元素的个数***************/ int sum = 0; showMatdate(mat2); sum = cvCountNonZero(&src2); printf("sum=%d\n", sum);
结果显示
矩阵除法计算
具体代码
<pre name="code" class="cpp">double x[3][3] = {{1, 50, -100}, {1, -110, 220}, {-1, 150, 150}}; double y[3][3] = {{1, 0, 0}, {0, 2, 0}, {0, 0, 3}}; /*****************数组除法运算************************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvDiv(&src1, &src2, &src3, 2); printf("cvDiv(mat1, mat2, 2)\n"); showMatdate(mat3); 注意:1、mat3 = mat1 * 2 / mat2。 2、如果矩阵中mat2某一位为0,则mat3对应那一位的结果直接为0。
结果显示
矩阵行列式计算
具体代码
<pre name="code" class="cpp">/*****************矩阵行列式计算**********************/ double sum = 0; sum = cvDet(&src1); showMatdate(mat1); printf("cvDet(mat1)=%.1lf\n", sum);
结果显示
矩阵元素指数计算
具体代码
<pre name="code" class="cpp">/*****************矩阵元素指数计算**********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvExp(&src1, &src3); printf("cvExp(mat1)\n"); showMatdate(mat3); 计算公式如下:
结果显示[编辑 | 编辑源代码]
矩阵水平/垂直翻转
具体代码
<pre name="code" class="cpp">/*****************矩阵水平或者垂直翻转**********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvFlip(&src1, &src3, -1); printf("cvFlip(mat1, -1)\n"); showMatdate(mat3); cvFlip(&src1, &src3, 0); printf("cvFlip(mat1, 0)\n"); showMatdate(mat3); cvFlip(&src1, &src3, 1); printf("cvFlip(mat1, 1)\n"); showMatdate(mat3);
注意:在cvFlip中,当flag小于0时,水平垂直都翻转;flag为0时,垂直翻转;flag大于0时,水平翻转。
相关文章推荐
- OpensGalaxy
- Freesshd配合xshell实现sftp上传
- linux内核配置入门
- Tomcat session共享 —MSM
- linux 安装nginx
- centos添加批量添加ip提示无效参数
- Linux下磁盘分区、文件管理工具详解
- 如何修改linux 的SSH的默认端口号
- OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
- shell编程之if判断的总结
- Linux编辑类命令
- 从Core Animation到Facebook‘s Pop(1)
- Linux kernel boot process
- shell中各种括号的作用()、(())、[]、[[]]、{}
- fdisk硬盘分区(1)——系统盘剩余空间创建分区
- tomcat 安装
- 关于EasyDropDown的选择select事件问题
- CentOS 越南韩国服务器时间同步配置方法
- 谁在使用我的网站——用户忠诚和价值分析
- Linux学习:Linux基础命令集(1)