博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CvMat 矩阵的使用方法和简单程序
阅读量:6338 次
发布时间:2019-06-22

本文共 3132 字,大约阅读时间需要 10 分钟。

一:CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP );

mat  指针指向要被初始化的矩阵头.
rows  矩阵的行数.
cols 矩阵的列数.
type 矩阵元素类型.
data 可选的,将指向数据指针分配给矩阵头.
step 排列后的数据的整个行宽。默认状态下。使用 STEP 的最小可能值。比如假定矩阵的行与行之间无隙

double a[] = { 1, 2, 3, 4

5, 6, 7, 8,
9, 10, 11, 12 };
double b[] = { 1, 5, 9,
2, 6, 10,
3, 7, 11,
4, 8, 12 };
double c[9];// c 数组存贮 a(3x4) 和 b(4x3) 矩阵的积
CvMat Ma, Mb, Mc ;
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );//创建矩阵,按行存储的
cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b );
cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c );

cvMatMulAdd( &Ma, &Mb, 0, &Mc );

cvReleaseMat(&Ma);

cvReleaseMat(&Mb);

cvReleaseMat(&Mc);

还有一种初始化矩阵:

double a[] = { 1,   2,   3,   4,

                5,   6,   7,   8,

9, 10, 11, 12 };

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

二:

cvMat存储矩阵的方法

cvGetRealND();返回单通道数组的指定元素

double cvGetReal1D( const CvArr* arr, int idx0 );

double cvGetReal2D( const CvArr* arr, int idx0, int idx1 );
double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 );
double cvGetRealND( const CvArr* arr, int* idx );
arr
输入数组,必须是单通道.
idx0
元素下标的第一个成员,以 0 为基准
idx1
元素下标的第二个成员。以 0 为基准
idx2
元素下标的第三个成员。以 0 为基准
idx
元素下标数组

返回特殊的数组元素

 cvSetRealND();//改动指定数组元素值

void cvSetReal1D( CvArr* arr, int idx0, double value );

void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
void cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value );
void cvSetRealND( CvArr* arr, int* idx, double value );
arr
输入数组.
idx0
元素下标的第一个成员。以 0 为基点
idx1
元素下标的第二个成员。以 0 为基点
idx2
元素下标的第三个成员,以 0 为基点
idx
元素下标数组
value
指派的值

cvGetND();//返回特殊的数组元素 多通道的

CvScalar cvGet1D( const CvArr* arr, int idx0 );
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );
CvScalar cvGetND( const CvArr* arr, int* idx );
arr
输入数组.
idx0
元素下标第一个以 0 为基准的成员
idx1
元素下标第二个以 0 为基准的成员
idx2
元素下标第三个以 0 为基准的成员
idx
元素下标数组

cvSetND();//改动指定的数组?多通道的

void cvSet1D( CvArr* arr, int idx0, CvScalar value );

void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value );
void cvSetND( CvArr* arr, int* idx, CvScalar value );
arr
输入数组
idx0
元素下标的第一个成员,以 0 为基点
idx1
元素下标的第二个成员,以 0 为基点
idx2
元素下标的第三个成员,以 0 为基点
idx
元素下标数组
value
指派的值

voidcvmSet( CvMat* mat, int row, int col, double value );//设置单通道浮点矩阵的指定元素

mat
矩阵.
row
行下标,以 0 为基点.
col
列下标,以 0 为基点.
value
矩阵元素的新值

doublecvmGet( const CvMat* mat, int row, int col );//返回单通道浮点矩阵指定元素

mat
输入矩阵.
row
行下标。以 0 为基点.
col
列下标,以 0 为基点

#include "cv.h"  
#include "highgui.h"  
#include <stdio.h> 
#include <math.h>  
#include <string.h>
#pragma comment(lib, "cv.lib")  
#pragma comment(lib, "cxcore.lib")  
#pragma comment(lib, "highgui.lib")  
main()
{  
CvMat Ma;
CvMat Mb;
CvMat *Mc;
int i,j;
double a[] = { 1,    2,    3,    4};
double b[] = { 1,    2,    3,    4 };
double c[]={0};
Mc=cvCreateMat(2,2,CV_64FC1);
  Ma=cvMat(2, 2, CV_64FC1, a);  
  Mb=cvMat(2, 2, CV_64FC1, b); 
  //cvTranspose(&Ma, Mc);//Ma的转置存储在Mc中,不能对自己进行转置
  cvMatMul(&Ma, &Mb, Mc);
  cvmSet(Mc,1,1,3);//设置2行2列的值为3
//cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a,CV_AUTOSTEP);
for(i=0;i<2;i++)
for(j=0;j<2;j++)
printf("%f ",cvGetReal2D(Mc,i,j));
//printf("%f ",cvGet2D(Mc,i,j));
}

转载地址:http://ouaoa.baihongyu.com/

你可能感兴趣的文章
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
关于 Nginx 配置 WebSocket 400 问题
查看>>
Glide和Govendor安装和使用
查看>>
Java全角、半角字符的关系以及转换
查看>>
Dubbo和Zookeeper
查看>>
前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变
查看>>
UOJ#179. 线性规划(线性规划)
查看>>
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
查看>>
windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
redis 安装
查看>>
SQL some any all
查看>>
电子书下载:Programming Windows Identity Foundation
查看>>
有理想的程序员必须知道的15件事
查看>>
用于测试的字符串
查看>>
财付通和支付宝资料收集
查看>>
PHPCMS V9数据库表结构分析
查看>>
理解 IEnumerable 与 IEnumerator
查看>>
NHibernate 2.0 Beta 1 Released和一些工具
查看>>
【每天一个Linux命令】12. Linux中which命令的用法
查看>>