《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
老板让让做一个东东。输入端要用到opencv顺便就来学习一下。买了本书《学习opencv》翻来一看,opencv1.0,去官网上一看。opencv2.49,瞬间有种蛋碎的赶脚。看着第二章介绍一个头文件,在opencv2.49以下招了半天都没找到。。。泪奔~~
只是看到一些论坛上说。这本书里还是讲了一些实用的算法的,所以还是决心细致读一读,里面的測试程序基本是亲手输入执行成功的,非常多样例我自也用不同的方法实现了一下,毕竟入门级新手。望各位老鸟勿喷。还请各位大手多多指点。
1.opencv基本数据结构:
|
结构 |
成员 |
意义 |
|
CvPoint |
int x,y |
图像中的点 |
|
CvPoint2D32f |
float x,y |
二维空间中的点 |
|
CvPoint3D32f |
float x,y,z |
三维空间中的点 |
|
CvSize |
int width,height |
图像的尺寸 |
|
CvRect |
int x,y,width,height |
图像的部分区域 |
|
CvScalar |
double val[4] |
RGBA值 |
2.CvMat矩阵结构:
(1)两点注意:
1.在Opencv中没有向量结构,不论什么时候须要向量,都仅仅是一个列矩阵。
2.Opencv矩阵的概念与我们在线性代数课上学习过的概念相比。更抽象,特别是矩阵的元素。
(2)CvMat结构:
typedef struct CvMat{
int type;
int step;
int* refcount;
union{
uchar* ptr;
short* s;
int* i;
float *f1;
double* db;
} data;
union{
int rows;
int height;
};
union{
int cols;
int width;
};
}CvMat;
(3)矩阵的创建与释放
CvMat* cvCreateMat( int rows, int cols, int type ); //创建一个矩阵
CvMat* cvCreateMatHeader( int rows, int cols, int type ); //创建一个矩阵结构,不分配空间
CvMat* cvInitMatHeader(CvMat* mat,int rows,int cols,int type,void* data = NULL,int step = CV_AUTOSTEP);//用一个现有矩阵初始化矩阵
CvMat cvMat(int rows,int cols,int type,void* data = NULL);//初始化矩阵结构,不分配空间
CvMat* cvCloneMat( const cvMat* mat );//复制一个mat副本
void cvReleaseMat( CvMat** mat ); //释放矩阵
(4)创建一个矩阵程序:
#include <cv.h>
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
float vals[] = {1,2,3,4}; CvMat rotmat; cvInitMatHeader(
&rotmat,
2,
2,
CV_32FC1,
vals
);
cout << rotmat.cols <<endl;
cout << rotmat.step <<endl;
cout << rotmat.rows <<endl;
cout << rotmat.type <<endl;
getchar();
return 0;
}
3.矩阵数据的存取(简单的方法。麻烦的方法,恰当的方法)
(1)简单的方法:
利用CV_MAT_ELEM()宏存取矩阵
#include "stdafx.h"
#include <cv.h>
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
float vals[] = {1,2,3,4}; CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 ); cvInitMatHeader(
rotmat,
2,
2,
CV_32FC1,
vals
);
float ele = CV_MAT_ELEM(*rotmat,float,1,1);
cout << ele << endl;
getchar();
return 0;
}
另外宏CV_MAT_ELEM_PTR()须要三个參数,传入矩阵。待返回元素的行和列。
它和上个宏一样。仅仅只是返回的是指向元素的指针。须要自己固定类型。
(2)麻烦的方法
使用cvPtr*D訪问矩阵,其结构为:
uchar* cvPtr1D(
const CvArr* arr, //訪问矩阵
int idx0, //元素索引
int* type = NULL//元素类型
);
uchar* cvPtr2D(
const CvArr* arr,
int idx0,
int idx1,
int* type = NULL
);
uchar* cvPtr3D(
const CvArr* arr,
int idx0,
int idx1,
int idx2,
int* type = NULL
);
uchar* cvPtrND(
const CvArr* arr,
int* idx,
int* type = NULL,
int create_node = 1,
unsigned* precalc_hashval = NULL
);
訪问实例:
#include <cv.h>
#include <iostream>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
float vals[] = {1,2,3,4}; CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 ); cvInitMatHeader(
rotmat,
2,
2,
CV_32FC1,
vals
);
float *p = (float*) cvPtr2D(rotmat,1,1);
cout <<*p<<endl;
getchar();
return 0;
}
(3)恰当的方法
计算机视觉是一种密集型的任务。所以应该利用最有效的方法做事。
方法:
#include <cv.h>
#include <iostream>
using namespace std; float sum( CvMat* mat ) {
float s = 0.0f;
for( int row=0; row<mat->height; row++ ) {
float* ptr = mat->data.fl + row * mat->step/4;
for( int col=0; col<mat->width; col++ ) {
s += *ptr++;
}
}
return( s );
}; int main(int argc, char** argv)
{
CvMat *mat = cvCreateMat(2,2,CV_32FC1);
float elem = 2;
*((float*)CV_MAT_ELEM_PTR( *mat, 0,0) ) = elem;
cvmSet(mat,0,1,3);
cvSetReal2D(mat,1,0,4);
cvSetReal2D(mat,1,1,5);
float s = sum(mat);
printf("%f\n",s);
getchar();
return 0;
}
to be continued
《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问的更多相关文章
- Android中关于JNI 的学习(三)在JNI层訪问Java端对象
前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...
- Opencv笔记(1) 命名规则数据结构(CvMat,...)
网上搜索了很多,检查中发现的信息劣势,检查源代码 同Cv为类的开始.包含详细的数据不(仅存储指针) CvMat typedef struct CvMat { int type; int step; / ...
- OpenCV(三) 之 基本数据结构 CvMat和 IplImage
OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之一
基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...
- struts2学习笔记(2)---Action中訪问ServletAPI获取Map类型的Servlet元素
源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符
重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...
- struts2学习笔记(3)---Action中訪问ServletAPI获取真实类型的Servlet元素
一.源码: struts.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE s ...
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
随机推荐
- Queue 与List、LinkedList与 ArrayList 区别
List 是一个接口,不能实例化,通过实例化ArrayList 或者LinkedList来调用:List list = new ArrayList(); |--List: 元素是有序的(怎么存的就怎么 ...
- JAVA 常用集合接口List、Set、Map总结
java中频繁使用List.Set.Map接口,将其总结如下 它们的继承与实现关系如下: Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└ ...
- 基本的Mysql语句
操作文件夹(库) 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database db1; # 查看所有的数据库 sho ...
- SQL查询中选取某个字段的前几个字符的方法
在统计某种数据名称是否存在规律时,可以通过group by进行统计,但是有时候存在钱几个字符相同,后面字符不同的情形.这样可以通过按照前几个字符串进行统计,SqlServer和Oracle中都可以使用 ...
- 一次显式GC导致的High CPU问题处理过程
项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...
- Struts2的学习链接
---- Struts2的学习途径 (downpour) http://www.iteye.com/wiki/struts2/1306-struts2-way-of-learning ---- Str ...
- Tomcatsession共享方案--memcached-session-manager
https://github.com/magro/memcached-session-manager/wiki/SerializationStrategies MSM的特性: a.支持t ...
- lua lfs库
lfs.attributes(filepath [, aname]) 获取路径指定属性 lfs.chdir(path) 改变当前工作目录,成功返回true,失败返回nil加上错误信息 l ...
- Service、chkconfig命令
转自:http://my.oschina.net/phptiger86/blog/137656
- winform右键菜单
public partial class Form1 : Form { ContextMenuStrip cms; Bitmap bm ; public Form1() { InitializeCom ...