老板让让做一个东东。输入端要用到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

转载于:https://www.cnblogs.com/lxjshuju/p/7008131.html

《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问相关推荐

  1. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  2. python tensorflow学习笔记(五)矩阵乘法运算

    相关公式 [0.36424586843872840.6675075448915823]×[0.134750808390697090.5863696301031353]=[0.44048858] \be ...

  3. 【Python学习笔记】多个矩阵点乘和叉乘

    [Python学习笔记]多个矩阵点乘和叉乘 一.定义 二.代码实现 一.定义 点乘,对应元素相乘,点乘对象的行数必须相等,且前者的列数必须与后者相等,或为1,具有广播机制. 叉乘,前者的列数必须和后者 ...

  4. MATLAB中table结构学习笔记01_table数据结构的创建

    我们不重复造轮子,但是我们是否掌握了造轮子的算法和技能? 文章目录 前言 1. 版本 2. 关键词 一.table数据结构简述 二.table的创建 1. 创建空的table 2. 创建0行多列的ta ...

  5. 学习OpenCV的学习笔记系列(三)显示图片及视频

    OpenCV是计算机视觉库,那么处理的对象无非两个:"图片"及"视频"(其实视频也是被解压成单帧图像来处理的,总的来说,还是处理图像). 那么要想学习OpenC ...

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

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

  7. 跟着小琼琼学习opencv~

    楼楼最近整理笔记,发现了自己学习Opencv时候的码的代码和简单介绍,现贴上来~主调用方法在最下方.转载请注明出处~ #include <opencv2\xfeatures2d\nonfree. ...

  8. 学习OpenCV(一)从Mat讲起

    本博客所用OpenCV版本为2.4.3,运行环境为Visual Studio2012. 学习OpenCV是一个比较漫长的过程,希望我能够坚持! (一)从Mat讲起 Mat是OpenCV中用于存放图像的 ...

  9. Opencv 笔记5 边缘处理-canny、sobel、Laplacian、Prewitt

    一.边缘检测概述 边缘检测是计算视觉中的基本问题,边缘检测的目的是标识图像中亮度变换明显的点.边缘检测大幅度的减少了图像的数据量(分为两种:灰度图像边缘检测和彩色图像边缘检测),并且剔除了不相关的信息 ...

最新文章

  1. ImportError: No module named tensorflow.compat.v1 忽略已经安装的某个包版本 忽略已安装版本...
  2. python-MySQLdb-练习
  3. 曙光中学2021年高考成绩查询,上海市部分高中2020高考录取喜报,成绩喜人!
  4. 上顿号符号_标点符号常见错误,读后涨知识了
  5. idea怎么创建python项目_idea创建django项目
  6. 绘制半圆_Android Canvas 绘制小黄人
  7. 10-算法 快速排序
  8. class layout basic 2
  9. 如何挑选大数据分析平台
  10. java读取txt文件内容 乱码_java读取txt文件乱码解决方法
  11. sublime中PyV8问题
  12. review board 使用
  13. java rms是什么意思,关于RMS的使用
  14. fanuc机器人四边形编程_FANUC机器人编程及应用
  15. linux进入pe系统,如何进入pe系统【设置模式】
  16. ngx_http_core_module模块提供的变量
  17. 懒人如何减肥肚子和腰 减腰腹最好的最快方法
  18. Core Data概述
  19. 华师大 OJ 2822
  20. zo 是什么 普及版 日后用到再看

热门文章

  1. SpringCloud的学习记录(1)
  2. DCF:A Dataflow-Based Collaborative Filtering Trainging Algorithm
  3. 一段比较好的加1操作。能够防止简单的++造成的溢出。
  4. [No0000D7]img生成器.bat合并所有图片到html网页中
  5. [国嵌笔记][036][关闭MMU和CACHE]
  6. 学习HTML:iframe用法总结收藏
  7. maya计算机内存不足请保存,Maya内存不足不能渲染怎么优化场景?
  8. Python爬虫自学之第(⑤)篇——爬取某宝商品信息
  9. JavaScript中的回调函数(callback)
  10. JDK源码学习路线~每天学一点~每天进步一点点