opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构

一.基本数据类型:

1.CvPoint

         图像中的点

         Opevcv提供的数据类型中最简单的就是CvPoint.

typedef struct CvPoint

{

    int x;

    int y;

}

CvPoint

         CvPoint包含int x 和int y两个数据成员,它的变体有CvPoint2D32f 和 CvPoint3D32f.

         CvPoint2D32f包含float x , float y两个数据成员.

         二维空间中的点

 

typedef struct CvPoint2D32f

{

    float x;

    float y;

}

CvPoint2D32f

 

         CvPoint3D32f 包含float x , float y , float z 三个数据成员.

         三维空间中的点

 

typedef struct CvPoint3D32f

{

    float x;

    float y;

    float z;

}

CvPoint3D32f

 

2. CvSize

         CvSize的数据成员是: int width , int height.

         图像的尺寸

 

typedef struct CvSize

{

    int width;

    int height;

}

CvSize;

 

对应的浮点类型的数据成员 , CvSize的变体: CvSize2D32f.

 

typedef struct CvSize2D32f

{

    float width;

    float height;

}

CvSize2D32f;

 

3.CvRect

         图像的部分区域

         派生自CvPoint和CvSize.

 

typedef struct CvRect

{

    int x;

    int y;

    int width;

    int height;

}

CvRect;

 

4.CvScalar

         RGBA值

         有一个单独的数据成员val , 它是一个指向4个双精度浮点数数组的指针.

 

typedef struct CvScalar

{

    double val[4];

}

CvScalar

 

 

5.CvMat

typedef struct CvMat

{

    int type;

    int step;

 

    /* for internal use only */

    int* refcount;

    int hdr_refcount;

 

    union

    {

        uchar* ptr;

        short* s;

        int* i;

        float* fl;

        double* db;

    } data;

 

#ifdef __cplusplus

    union

    {

        int rows;

        int height;

    };

 

    union

    {

        int cols;

        int width;

    };

#else

    int rows;

    int cols;

#endif

 

}

CvMat;

        

二、矩阵的创建和释放:

1.矩阵的创建

Path1:  CvMat* cvCreateMat(int rows, int cols, int type) //分配内存空间

Path2:  CvMat* cvCreateMatHeader(int rows, int cols, int type) //不分配分配内存空间

Path3:  CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP)//利用现有的mat结构创建一个新的矩阵

Path4:  CvMat cvMat(int rows, int cols, int type, void* data=NULL) //轻量级创建一个矩阵并分配存储空间的办法

Path5:  CvMat* cvCloneMat(const CvMat* mat) //header and data are all allocated.

 

#include <cv.h>

#include <highgui.h>

int main()

{

         float vals[]={0.866025,-0.50000,0.500000,0.866025};

         CvMat rotmat;

         cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);

}      

2.矩阵的存取方法:

    

1.简单的方法:

                   CV_MAT_ELEM()  CV_MAT_ELEM_PTR() 存取数据。

例程:

         CvMat * mat1 = cvCreateMat( 5,5,CV_32FC1);

         float element_3_3 = 7.7;

         *((float *)CV_MAT_ELEM_PTR(*mat1,3,2) ) =element_3_3;

2.麻烦的方法:  

    返回指针的:

C: uchar* cvPtr1D(const CvArr* arr, int idx0, int* type=NULL)

 

C: uchar* cvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL)

 

C: uchar* cvPtr3D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL)

 

C: uchar* cvPtrND(const CvArr* arr, int* idx, int* type=NULL, int createNode=1, unsigned int* precalcHashval=NULL)

 

返回元素对象:

cvGetReal*D()

cvGet*D()

cvSetReal*D()

cvSet*D()

cvSet()//处理单通道数据

cvGet() //处理单通道数据

 

3.适当的方法

/**

累加一个三通道矩阵中的所有元素

**/

#include <cv.h>

#include <highgui.h>

 

float sum(const CvMat * mat)

{

    float s = 0.0f;

    for(int row=0;row<mat->rows;row++)

    {

        float * ptr = (float *)(mat->data.ptr + row * mat->step);//每一行都要重新计算起始位置

        for(int col =0;col<mat->cols;col++)

        {

            s+= *ptr ++; //ptr++指向下一个数据

        }

    }

    return s;

}

int main()

{

    float vals[]={0.866025,-0.

3.点的数组

         注意点的存储和内存布局的关系。

         例如:有n个三维的点,存储到CvMat 结构中,有几种存储方式?

         ①用一个二维数组,数组的类型是:CV32FC1,n行3列

         ②用一个二维数组,数据的类型是:CV32FC1,3行n列

         ③用一个二维数组,数据的类型是:CV32FC3,n行1列

         ④用一个二维数组,数据的类型是:CV32FC3,1行n列

注意:CV32FC1等的结构都是顺序型的通道。通道的概率其实我也不是很明确。

目前的理解是:

         我们可以看出,前三种的内存分配情况相同,但最后一种的内存分配不同。更复杂的是,如果有n维数组,每个数组的元素是c维(c可能是  通道数)时。所以,多维数组(矩阵)和一个一维但包含多维数据的数组一般是不同的。

    对于一个Rows行Cols列,通道数为Channels的矩阵,访问其中第row行,第col列,第channel通道的数据,可以使用如下公式:

  数据地址偏移量=row*Cols*Channels+col*Channels+channel

转载于:https://www.cnblogs.com/feng-fan/archive/2013/03/04/2943040.html

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

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

相关文章

LeetCode MySQL 614. 二级关注者

文章目录1. 题目2. 解题1. 题目 在 facebook 中&#xff0c;表 follow 会有 2 个字段&#xff1a; followee, follower &#xff0c;分别表示被关注者和关注者。 请写一个 sql 查询语句&#xff0c;对每一个关注者&#xff0c;查询关注他的关注者的数目。 比方说&#xff1a…

PHP安全最大化

PHP安全最大化 php中退出时清除session的问题 今天在做php项目的时候,需要增加安全退出的功能,也就是要求用户点"安全退出"时,执行清除session操作,并转到登录页.没想到在这个地方也小"卡"了一下. 出现的问题是当我点"安全退出"后转到登录…

java中字母用什么单词赋值_Java初学

Java-SUN语言平台J2SE(桌面) ,J2ME(移动被安卓所取代),J2EE(企业主要用于web)1.跨平台(操作系统)原理&#xff1a;在任意操作系统上运行&#xff0c;一次编写到处运行。依赖JVM(Java Virtual Machine)(不同系统Windows&#xff0c;Linux&#xff0c;mac有自己对应的JVM)2. JRE和…

POJ-3590 The shuffle Problem 置换+DP | DFS

题目链接&#xff1a;http://poj.org/problem?id3590 自己暴力给水过去了&#xff0c;不过效率有点低。题目要求的就是给一个数n&#xff0c;要你求出一种方案&#xff0c;一些和为n的数的最小公倍数最大。题目数据量不大&#xff0c;容易想到用暴力的办法求出所用情况&#x…

LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

文章目录1. 题目2. 解题1. 题目 表 Accounts: ------------------------ | Column Name | Type | ------------------------ | id | int | | name | varchar | ------------------------ id 是该表主键. 该表包含账户 id 和账户的用户名.表 Log…

Java随机生成长宽的矩形_java – 将正方形或矩形分解为大量随机大小的正方形或矩形...

提供的代码创建一个k-d tree.您可以使用它在矩形上绘制线条,将其划分为更小的矩形.获得树后,可以按如下方式使用它将区域划分为这些矩形&#xff1a;>在树的根部选择节点.>通过这一点绘制一条垂直线.>选择它的左子,在你刚刚通过它的父线绘制的线左侧的这一点画一条水平…

java自动加空格吗_程序加上空格和不加空格运行结果不一样

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;2程序加上空格和不加空格运行结果不一样程序第六行在教育教学后面加空格结果为全部图书&#xff1a;1.郁达夫随笔&#xff1a;伤感行旅 郁达夫 北京大学出版社 38.02.教育教学 李晓燕 高等教育出…

LeetCode MySQL 585. 2016年的投资(窗口函数over(partition by xx))

文章目录1. 题目2. 解题1. 题目 写一个查询语句&#xff0c;将 2016 年 (TIV_2016) 所有成功投资的金额加起来&#xff0c;保留 2 位小数。 对于一个投保人&#xff0c;他在 2016 年成功投资的条件是&#xff1a; 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2…

黑马程序员---面向对象笔记总结

------- android培训、java培训、期待与您交流&#xff01; ---------- 封装 匿名函数 2--匿名对象使用方式一&#xff0c;当对象的方法只调用一次时&#xff0c;可以用匿名对象完成&#xff0c;这样写比较简单&#xff0c;如果对一个对象进行多个成员必须个这个对象起个名字…

mysql 选择特定的表_MySQL选择具有多个特定列的所有表

我想获取具有3个特定列的所有表名.我想要的是从信息模式中获取所有包含columnA AND columnB AND columnC的表名.目前,我正在使用类似的查询SELECT DISTINCT TABLE_NAMEFROM INFORMATION_SCHEMA.COLUMNSWHERE COLUMN_NAMEcolumnAAND TABLE_SCHEMAmysampledatabase;如何扩展上述查…

LeetCode MySQL 1321. 餐馆营业额变化增长(over窗口函数)

文章目录1. 题目2. 解题1. 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount | int | ---------------------…

HTML DOM content 属性

摘自&#xff1a;http://www.w3school.com.cn/htmldom/prop_style_content.asp 定义和用法 content 属性设置文本或图像出现&#xff08;浮动&#xff09;在另一个元素中的什么地方。 语法&#xff1a; Object.style.contentvalue 可能的值 值描述string定义文本内容。url定义 …

java requestbody map_java-如何将Map转换为RequestBody?

使用Retrofit 2.4.0,我正在发出Multipart POST请求.我正在将文件作为Part以及一些元数据作为PartMap发送.这就是通话的样子.MultipartPOST("https://8hoot.com/my-path")Single> uploadMedia(PartMap Map metadata,Part MultipartBody.Part filePart);还有另一个M…

LeetCode MySQL 1398. 购买了产品A和产品B却没有购买产品C的顾客

文章目录1. 题目2. 解题1. 题目 Customers 表&#xff1a; ------------------------------ | Column Name | Type | ------------------------------ | customer_id | int | | customer_name | varchar | ------------------------------ cust…

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议&#xff1a;TCP,UDP TCP TCP是Transfer Control Protocol&#xff08;传输控制协议&#xff09;的简称&#xff0c;是一种面向连接的保证可靠传输的协议。 在TCP/IP协议中&#xff0c; IP层主要负责网络主机的定位&#xff0c;数据传输的路由&#xff0c;由IP地址…

Java求最小数用哪个函数_在Java中使用小数进行计算的函数

例如,当您键入22和56时,此代码可以正常工作,它显示正确的结果import java.util.Scanner;class apples{public static void main(String args[]){Scanner villy new Scanner (System.in);double fnum, snum, answer;System.out.println("Enter first num: ");fnum v…

LeetCode MySQL 1285. 找到连续区间的开始和结束数字(dense_rank连续排名)

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Logs ------------------------ | Column Name | Type | ------------------------ | log_id | int | ------------------------ id 是上表的主键。 上表的每一行包含日志表中的一个 ID。后来一些 ID 从 Logs 表…

java自定义标签简单_JSP 自定义标签之一 简单实例

在jsp中使用自定义标签可以达到这样的目的&#xff0c;事实上&#xff0c;我们所熟知的各类框架基本上都是通过自定义标签的形式来实现的。通过使用自定义标签&#xff0c;我们可以将实现复杂的逻辑在页面用简单的标签来加以展示。下面我们来实现一个非常简单的自定义标签&…

case study

To be continue...转载于:https://www.cnblogs.com/zhangzhang/archive/2013/03/10/2953199.html

LeetCode MySQL 1440. 计算布尔表达式的值(case when then else end)

文章目录1. 题目2. 解题1. 题目 表 Variables: ------------------------ | Column Name | Type | ------------------------ | name | varchar | | value | int | ------------------------ name 是该表主键. 该表包含了存储的变量及其对应的值.表…