通过指针访问矩阵数据

1、mat.data.ptr是一个数据块的起始地址的指针,是uchar型(mat是CvMat mat)

2、mat.step是一行有多少个字节

3、float* ptr=(float*)(mat.data.ptr+mat.step)可以将指针指向下一行数据的起始地址

#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main(int argc, char* argv[])
{
float data[18]={10,11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16,17};

//单通道二维矩阵
printf("单通道二维矩阵:\n");
CvMat mat_2;
cvInitMatHeader(&mat_2,3,6,CV_32FC1,data);
int y,x; //y行X列
for(y=0;y<mat_2.rows;y++)
{
float* ptrs=(float*)(mat_2.data.ptr+y*mat_2.step);

for(x=0;x<mat_2.cols;x++)
{
float value=*(ptrs+x);
printf("%f ",value);
}
printf("\n");
}
printf("\n");

//双通道二维矩阵
int chanels=2; //通道数
printf("双通道二维矩阵:\n");
CvMat mat_3;
cvInitMatHeader(&mat_3,3,3,CV_32FC2,data);
for(y=0;y<mat_3.rows;y++)
{
float* ptr_s=(float*)(mat_3.data.ptr+y*mat_3.step);
for(x=0;x<mat_3.cols;x++)
{
float values[2];
values[0]=*(ptr_s+x*chanels);
values[1]=*(ptr_s+x*chanels+1);
printf("<%f %f> ",values[0],values[1]);
}
printf("\n");
}

return 0;
}

时间: 2024-08-03 15:33:41

通过指针访问矩阵数据的相关文章

C - 指针与数据

一.数组 /*day_mon.c -- 打印每月的天数*/ #include <stdio.h> #define MONTHS 12 #define MAX_LEN 80 int main(void) { /*使用const表示char为只读数据,不允许被修改*/ const char months[MONTHS][MAX_LEN] = {"January", "February", "March", "April"

用结构体指针存储数据__正序_逆序下的输入

逆序输入 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 #define maxn 1000 5 6 //邻接表(点很多,边较少) 7 //共有n个点,点编号为1~n,m条边 8 //无向图 9 10 struct node 11 { 12 long value; 13 struct node *next; 14 }*d[maxn+1]; 15 16 int main() 17 { 1

【转载】C/C++杂记:深入理解数据成员指针、函数成员指针

原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示.例: 代码示例:   2. 函数成员指针 函数成员指针与普通函数指针相比,其size为普通函数指针的两倍(x64下为16字节),分为:ptr和adj两部分. (1) 非虚函数成员指针 ptr部分内容为函数指针(指向一个全局函数,该函数的第一个参数为this指针),ad

C指针--通过二级指针往回拉数据

现在有这种需求,在main函数中建立一个二叉树的root结点的指针,在tree_create函数中malloc或者new一个二叉树结点,然后在main函数中能正常的访问这个新建的结点. 注:这里的tree_create的返回值为void,也就是说不能通过函数的返回值返回指向结点的指针. 能想到的办法就是通过二级指针往回拉结点的数据.具体的实现流程是这样的: void tree_create(tree **tmp); int main(void) { tree *T = NULL;//T是二叉树结

不同平台下int类型、指针类型的数据大小

不同平台下int类型.指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题. 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小. 在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案,自然不可能集齐每个平台,一个个地去试,我们必须从底层进行分析. 数据总线和地址总线 计算机内的数据总线是CPU与外设进行数据交换的通路,而地址总线则是CPU用于寻址的通路. 数据总线的位数决定了CPU

c指针 --笔记2返回指针值的函数

返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int argc, char const *argv[]) { double score[][4] = {{60.0, 70.0, 80.5, 20.1}, {60.0, 70.0, 80.5, 21.1}, {60.0, 70.0, 80.5, 22.1}}; double *search(double(*pointer

UGUI事件系统——事件数据

事件数据 - EventData BaseEventData:基础事件数据 -事件数据的基类,和EventSystem配合使用 PointerEventData:指针事件数据 -鼠标与触摸事件的相关数据(点击.抬起.拖动等),UGUI中大部分事件数据类型都是PointerEventData类型 button:该属性有3个取值.分别是Left(鼠标左键).Right(鼠标右键).Middle(鼠标中键) clickCount:连续点击的次数 clickTime:发送点击事件的时间 delta:当前

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除

什么时候使用引用?和什么时候使用指针

什么时候使用引用?和什么时候使用指针 1.问题提出: 当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别? 比如: DateType ExampleFun(CString &strFileName,...)与 DateType ExampleFun(CString strFileName,...) 解答之前,我们先来看2个基本的概念:形参和实参. ->通俗的讲:形参是形式上的参数,实参是实际的参数; ->详细的讲:形参只是对实参的一种抽象类型描述,只是声明一个函数(方法)能