老板让让做一个东东。输入端要用到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,矩阵訪问的更多相关文章

  1. Android中关于JNI 的学习(三)在JNI层訪问Java端对象

    前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...

  2. Opencv笔记(1) 命名规则数据结构(CvMat,...)

    网上搜索了很多,检查中发现的信息劣势,检查源代码 同Cv为类的开始.包含详细的数据不(仅存储指针) CvMat typedef struct CvMat { int type; int step; / ...

  3. OpenCV(三) 之 基本数据结构 CvMat和 IplImage

    OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...

  4. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  5. struts2学习笔记(2)---Action中訪问ServletAPI获取Map类型的Servlet元素

    源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  6. C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符

    重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...

  7. struts2学习笔记(3)---Action中訪问ServletAPI获取真实类型的Servlet元素

    一.源码: struts.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE s ...

  8. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...

  9. OpenCV(2)-Mat数据结构及访问Mat中像素

    Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...

随机推荐

  1. 用WPF做关于MEF 简单学习记录

    写在前面:下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://www.cnblogs.com/yunfeifei/p/392266 ...

  2. HUdson2092整数解

    2019-05-17 16:04:37 加油,坚持就是胜利,fightting m / i的情况,i可能等于0 #include <bits/stdc++.h> using namespa ...

  3. win7如何给虚拟机设置共享文件

    友情提示:设置之前先把虚拟机关掉 1. 安装vmtools 安装过的,则不需要 重新安装 如果没有安装vmware tools,点击安装(需要联网下载) ,下载完成后,打开虚拟机 点击安装,安装完毕后 ...

  4. Python基本数据类型之字符串str

    字符串 定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,‘’或“”或‘’‘ ’‘’中间包含的内容称之为字符串 字符串的结构类型为'...' "..." "' ...

  5. POJ 3258 (NOIP2015 D2T1跳石头)

    河中跳房子 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石.这项激动人心的活动在一条长长的笔直河道中进行, ...

  6. [XJOI]noip43 T2多人背包

    多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...

  7. Spark Streaming概念学习系列之SparkStreaming性能调优

    SparkStreaming性能调优 合理的并行度 减少批处理所消耗时间的常见方式还有提高并行度.有以下三种方式可以提高并行度: 1.增加接收器数目 有时如果记录太多导致单台机器来不及读入并分发的话, ...

  8. react拼接class&将JS标签转换为HTML

    1.在JS中混杂字符和HTML标签,识别方法: const menuList = ['门店', '星享俱乐部', '菜单', '<hr></hr>', '星巴克移动应用', ' ...

  9. Python matplotlib库

    安装日期:2017.9.7 版本不太清楚,为啥嘞? 从python2到python3,还有在学的tensorflow,版本一更新就会有之前的代码不能用了.学习的时候用别人的代码各种出错,查了半天发现那 ...

  10. mysql数据库索引原理及其常用引擎对比

    索引原理 树数据结构及其算法简介 B+/-树: - 多路搜索树; - 时间复杂度O(logdN);h为节点出度,d为深度 红黑树: - 节点带有颜色的平衡二叉树 - 时间复杂度O(log2N);h节点 ...