OpenCV中CvMat的初始化[转]
一)cvCreateMat创建和分配数据
CvCreateMat会创建CvMat,并为CvMat分配数据。cvCreateMat可以配合cvInitMatHeader来初始化CvMat对象。
因为CvCreateMat创建的CvMat,对象在堆上,数据也在堆上,所以cvInitMatHeader在指定新的数据所在的位置的同时,也将CvMat::hdr_refcount和CvMat::refcount都置为0,以便cvReleaseMat释放CvMat对象和数据。
#include <cv.h>
#include <stdio.h>
int main()
{
double a[9]={1,2,3,4,5,6,7,8,9};
double* data=0; CvMat *pm=cvCreateMat(3,3,CV_64FC1);
cvInitMatHeader(pm,3,3,CV_64FC1,a);
data=pm->data.db;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); cvReleaseData(pm);
cvReleaseMat(&pm); return 0;
}
二)cvCreateMatHeader创建
cvCreateMatHeader只会创建CvMat,不会为CvMat分配数据。cvCreateMatHeader可以配合cvInitMatHeader来初始化CvMat对象。
因为cvCreateMatHeader创建的CvMat,对象在堆上,所以cvInitMatHeader在指定新的数据所在的位置的同时,也将CvMat::hdr_refcount置为0,以便cvReleaseMat释放CvMat对象和数据。
#include <cv.h>
#include <stdio.h>
int main()
{
double a[9]={1,2,3,4,5,6,7,8,9};
double* data=0; CvMat *pm=cvCreateMatHeader(3,3,CV_64FC1);
cvInitMatHeader(pm,3,3,CV_64FC1,a);
data=pm->data.db;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); cvReleaseData(pm);
cvReleaseMat(&pm); return 0;
}
三)cvMat创建和初始化
cvMat可以视作是CvMat的构造函数,它是一个内联函数。cvMat可以为CvMat指定数据所在的位置。
cvMat在栈上创建CvMat,所以CvMat::hdr_refcount置为0。cvMat并未给CvMat分配数据(在堆上),而是直接传入已经创建好的数据(在堆上或在栈上),所以CvMat::refcount置为NULL。正因为前面两者,可以为一个CvMat变量多次使用cvMat(还可以使用cvInitMatHeader)而不用考虑内存泄露,最后用cvReleaseData释放堆上创建的CvMat对象,或称为矩阵头对象就可以了。
这一初始化方式类似于CvSize等的构造方式,只不过比它们复杂些(传入参数多且需要cvReleaseData来释放堆上创建的CvMat对象)。
cvMat和cvCreateMatHeader都是初始化CvMat头,都没有分配数据。他们的区别在于:
1)cvMat在栈上创建CvMat,cvCreateMatHeader在堆上创建CvMat。
2)cvMat内头引用数置为0,cvCreateMatHeader内头引用数置为1。
3)cvMat可以指定数据所在位置,cvCreateMatHeader不能。
4)cvMat是内联函数,cvCreateMatHeader的错误处理机制更完善。
#include <cv.h>
#include <stdio.h>
int main()
{
double a[9]={1,2,3,4,5,6,7,8,9};
double b[6]={6,5,4,3,2,1};
double c[4]={4,3,2,1};
double* data=0; CvMat m=cvMat(3,3,CV_64FC1,a);
data=m.data.db;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); //再次使用cvMat
m=cvMat(2,3,CV_64FC1,b);
data=m.data.db;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); //使用cvMatcvInitMatHeader
cvInitMatHeader(&m,2,3,CV_64FC1,c,CV_AUTOSTEP);
data=m.data.db;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
printf("%3.lf",data[i*2+j]);
}
printf("\n");
}
printf("\n"); //cvReleaseData可以使CvMat::data.ptr置为NULL
//不能调用cvReleaseMat,因cvMat未给CvMat分配数据
cvReleaseData(&m); return 0;
}
四)直接初始化
#include "cxcore.h"
#include <stdio.h>
void main()
{
CvMat* mat = cvCreateMat(3,3,CV_32FC3);
cvZero(mat); float *p = (float*)cvPtr2D(mat, 0, 0);
for(int i = 0; i < 9; i++)
{
*p = (float)i*10;
p++;
*p = (float)i*10+1;
p++;
*p = (float)i*10+2;
p++;
} p = (float*)cvPtr2D(mat, 0, 0); for(i = 0; i < 9; i++)
{
printf("%2.1f,%02.1f,%2.1f\t",*p,*(p+1),*(p+2));
p+=3;
if((i+1) % 3 == 0)
printf("\n");
}
}
五)cvInitMatHeader初始化
cvInitMatHeader并不创建CvMat对象,这个对象由用户创建(在堆上或栈上)并传入。cvInitMatHeader也不创建数据,也是作为参数传入。cvInitMatHeader利用传入的数据等参数初始化这个用户传入的CvMat。
CvMat::hdr_refcount被置为0,不管传入的CvMat对象在堆上创建还是在栈上创建。CvMat::refcount被置为NULL,不管数据是否创建或指定。cvInitMatHeader可以为CvMat指定新的数据所在的位置。可以为一个CvMat变量多次使用cvInitMatHeader(还可以使用cvMat)。
cvInitMatHeader与cvMat和cvCreateMatHeader的最大区别在于前者不创建CvMat对象,后者创建CvMat对象。
cvInitMatHeader可以独立,也可以配合cvCreateMatHeader和cvCreateMat,来初始化CvMat。
#include <cv.h>
#include <stdio.h>
int main()
{
double a[9]={1,2,3,4,5,6,7,8,9};
double b[6]={6,5,4,3,2,1};
double c[4]={4,3,2,1};
double* data=0; CvMat m;
cvInitMatHeader(&m,3,3,CV_64FC1,a);
data=m.data.db;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); //再次使用cvInitMatHeader
cvInitMatHeader(&m,3,3,CV_64FC1,b);
data=m.data.db;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%3.lf",data[i*3+j]);
}
printf("\n");
}
printf("\n"); //使用cvMat
m=cvMat(2,2,CV_64FC1,a);
data=m.data.db;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
printf("%3.lf",data[i*2+j]);
}
printf("\n");
}
printf("\n"); //cvReleaseData可以使CvMat::data.ptr置为NULL
//不能调用cvReleaseMat,因cvInitMatHeader未给CvMat分配数据
cvReleaseData(&m); return 0;
}
OpenCV中CvMat的初始化[转]的更多相关文章
- OpenCV中IplImage/CvMat/Mat转化关系
原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- OpenCV 中的三大数据类型:CvMat 类型
前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转)
cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numeric ...
- OpenCV中的矩阵和图像类型
任务刚刚做完,就迫不及待的来写写在OpenCV中常见的几类数据类型: 在使用OpenCV时我们时常会碰到IplImage这个数据类型,IplImage就是我们通常说的“图像”进行编码的基本结构,这些图 ...
- OpenCV之CvMat、Mat、IplImage之间相互转换实例(转)
OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数.初学者应该掌握并熟练应用.但是我认为计算机专业学习的方法是,不断的总结并且提炼,同时还要做大量的实践,如编码,才能 ...
- Opencv中SVM样本训练、归类流程及实现
支持向量机(SVM)中最核心的是什么?个人理解就是前4个字--"支持向量",一旦在两类或多累样本集中定位到某些特定的点作为支持向量,就可以依据这些支持向量计算出来分类超平面,再依据 ...
- 解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。
说明:本文所有算法的涉及到的优化均指在PC上进行的,对于其他构架是否合适未知,请自行试验. Box Filter,最经典的一种领域操作,在无数的场合中都有着广泛的应用,作为一个很基础的函数,其性能的好 ...
- 混合高斯模型:opencv中MOG2的代码结构梳理
/* 头文件:OurGaussmix2.h */ #include "opencv2/core/core.hpp" #include <list> #include&q ...
随机推荐
- vue 路由监听
发现网上其实有很多种答案,但是测试之后发现很多都不行,或者写的不完整. 一.在app.vue组件内,增加监听$route,如下: watch: { $route(to, from) { console ...
- [转载] C++ 类中的类成员变量怎么调用带参数的构造函数来初始化?
#include "stdafx.h" class A { public: A(){ax = ;}; A(int a){ax = a;}; int ax; }; class B { ...
- java中有关socket通信的学习笔记
最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...
- 1.25-1.26 Coordinator数据集和oozie bundle
一.Coordinator数据集 二.oozie bundle
- Python 之IO模型
阻塞IO模型:以前写的套接字通信都是阻塞型的.通过并发提高效率 非阻塞IO模型: from socket import * # 并不推荐使用,一是消耗cpu资源,二是会响应延迟 server = so ...
- 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)
一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...
- 洛谷 - P2281 - 多项式的加法和乘法 - 大模拟
题目链接:https://www.luogu.org/problemnew/show/P2281 题目的意思很简单,输入两个系数.指数都是整数,变量都是大写字母的多项式,求他们的加法结果和乘法结果. ...
- HDU5908【模拟】
思路: 找到约数k,然后算一下1-k区间里的数的个数. 中间交换一下就好了,然后把后面每个区间里的数减减,然后再判断一下满足不满足= = #include <bits/stdc++.h> ...
- Android NDK开发指南(二)Android.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382225.html 1. 概述 Android.mk文件是用来描述build sy ...
- DirectX实现球面纹理映射
http://www.cnblogs.com/graphics/archive/2011/09/13/2174022.html DirectX实现球面纹理映射 介绍 球面纹理映射就是将一个平面纹理映射 ...