《学习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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十四章——文件管理的代码保存

这是关于文件的增删改查代码的记录&#xff1a; package com.maya.hanqi.filemanager;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; i…

oracle数据库查看用户相关语句

1.查看所有用户&#xff1a; select * from dba_users; select * from all_users; select * from user_users; 2.查看用户或角色系统权限(直接赋值给用户或角色的系统权限)&#xff1a; select * from dba_sys_privs; select * from user_sys_privs; (查看当前用户所拥有的权限…

1252: [蓝桥杯2015初赛]奇妙的数字

题目描述 小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗&#xff1f; 输出 请输出该数字&#xff0c;不要输出任何多余的内容。 时间限制: 1 Sec 内存限制: 256 MB 原题链接&#xff1a;http://oj.ecustacm.cn/pr…

面向对象chapter1

1.从现实抽象出类的步骤第一&#xff1a;找出分类&#xff08;分析出类&#xff09;第二&#xff1a;找出类的特征&#xff08;分析类的相关属性&#xff09;第三&#xff1a;找出类的行为&#xff08;分析类的方法&#xff09;2.常量&#xff08;经常出现的变量值&#xff09;…

csp真题 202109-2非零段划分C++代码(100分)

试题编号&#xff1a; 202109-2 试题名称&#xff1a; 非零段划分 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 样例1输入 11 3 1 2 0 0 2 0 4 5 0 2样例1输出 5样例1解释 p2时&#xff0c;A[3,0,2,0,0,2,0,4,5,0,2]&#xff0c;5个非零段依次为[3]、[2]、[2…

python:浅析python 中__name__ = '__main__' 的作用(转载)

转自&#xff1a;http://www.cnblogs.com/alan-babyblog/p/5147770.html#undefined 有句话经典的概括了这段代码的意义&#xff1a; “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用&#xff0c;另外该模块自己也可执行…

1251: [蓝桥杯2015初赛]星系炸弹

时间限制: 1 Sec 内存限制: 256 MB 题目链接&#xff1a;http://oj.ecustacm.cn/problem.php?id1251 题目描述 在X星系的广袤空间中漂浮着许多X星人造“炸弹”&#xff0c;用来作为宇宙中的路标。 每个炸弹都可以设定多少天之后爆炸。 比如&#xff1a;阿尔法炸弹2015年1月1日…

每天五个java相关面试题(3)

1. Servlet的生命周期是什么?答&#xff1a; 第一次请求: 构造方法->init() -> service() -> doGet()/doPost() 以后的请求&#xff1a;service() -> doGet()/doPost(); Servlet是单实例的. 2. 说出ArrayList,Vector, LinkedList的存储性能和特性HashMap和Has…

c++中四舍五入取整、向上取整和向下取整问题

方法一&#xff1a;利用c函数 四舍五入&#xff1a;round()函数 向上取整&#xff1a;ceil()函数 向下取整&#xff1a;floor()函数 #include <iostream> #include <cmath>//函数头文件 using namespace std; int main() {double a1.2;double b3.7;cout<<&q…

SQL PROMPT5.3.4.1的一些设置选项

摘自&#xff1a;http://www.cnblogs.com/furenjian/p/4519426.html sql prompt这个工具安装好之后就可以在SSMS里使用代码提示功能 园子里非常多的文章&#xff1a;例如SQLSERVER开发利器XXXXXX http://www.cnblogs.com/VAllen/archive/2012/09/08/SQLPrompt.html http://www.…

csp真题202112-1 序列查询 (100分)

#include <iostream> using namespace std; int A[1000000]{0};//c中一定一定要要记得给变量赋初始值&#xff0c;会减少很多不必要的麻烦 //尽可能将数组量大的数组定义在函数外面&#xff0c;不要在函数内部定义大数组 int main() {int n0,N0,sum0,i0;cin>>n&g…

云麦小米华为体脂秤怎么样_测评华为智能体脂秤,比小米智能体重秤贵30元到底差别在哪里?...

“流浪的好奇”每天更新最新科技资讯和产品测评内容&#xff0c;欢迎您关注订阅&#xff01;我们之前说过华为可不仅仅只有5G通讯技术和智能手机&#xff0c;华为杂货铺里的产品虽然不如小米杂货铺那么的丰富&#xff0c;但是也不是空铺一个&#xff0c;还是有一些华为主业之外…

c++中引用和指针的区别

指针是指向一块内存&#xff0c;它的内容是所指内存的地址&#xff1b; 而引用则是指向某块内存变量的一个别名&#xff0c;相当于变量的另一个名字。 例如&#xff1a; #include <stdio.h> int main() {int a2;int &ba;printf("a:%d\n",a);printf("…

什么是大数据,怎么理解和应对大数据时代

什么是大数据&#xff0c;怎么理解和应对大数据时代 在大数据与深度学习中蝶化的人工智能。当代人工智能离不开大数据和深度学习算法。我们先来了解什么是大数据&#xff0c;大数据的本质是什么&#xff0c;在大数据时代我们应该如何应对&#xff1f; 当我们谈论数据的时候我们…

android 手机获取公网ip_KSWEB 旧手机搭建网站服务

? 感谢你阅读「 Android 应用 」的第 113篇分享文章KSWEB 是一款由俄罗斯开发者开发的一款可以在 Android 手机上安装建站相关服务的应用&#xff0c;支持 Lighttpd、Nginx、Apache、MySQL、FTP、PHP 等。打开应用后点击不再提醒忽略弹窗&#xff0c;给予权限后等待片刻按照提…

盘锦工业机器人厂家_盘锦制造进入“机器人时代”

原标题&#xff1a;盘锦制造进入“机器人时代”——盘锦高新区企业技术创新见闻“忽如一夜春风来&#xff0c;千树万树梨花开。”最近&#xff0c;记者走访了盘锦高新区部分装备制造企业&#xff0c;那一个又一个“机器人”&#xff0c;正在形成盘锦“机器人方队”&#xff0c;…

如何判断windows版本?

windows版本名称太多&#xff0c;怎么通过版本号&#xff0c;取得对应的版本名称&#xff1f; 版本号与市场名称的关系 在微软与IBM分家的时候Windows操作系统改名叫做Windows NT&#xff0c;第一个版本是Windows NT 3.1。 后来由于市场需要&#xff0c;在每次发布Windows之前&…

phpStydy配置memcache扩展

phpStydy配置memcache扩展 先提示一点&#xff1a;我电脑是win7 64 位的&#xff0c;但我用的环境是phpstudy (php5.6nginx); 下面的下载里我下载64位软件安装后没反映&#xff0c;因为phpstudy环境是32位的,下载32位安装后memcache就成功了; 一、下载并安装memcached服务器端软…

hadoop 计算几点 主节点_01-Hadoop的介绍

Hadoop的介绍Hadoop最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎&#xff0c;包括网页抓取、索引、查询等功能&#xff0c;但随着抓取网页数量的增加&#xff0c;遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题. 2003年、2004年谷歌发表的两…

使用traits技术表现迭代器类型 iterator_category

1.STL的迭代器类型标识&#xff0c;和容器中的迭代器类型。 2.使用trait技术实现stl的advance功能。 3.迭代器trait中的其他类型定义。 1.STL的迭代器类型标识&#xff0c;和容器中的迭代器类型。 熟悉的迭代器类型&#xff0c;输入、输出、前向、双向、随机。 c标准程序库分别…