OPENCV 4. 矩阵维度、通道和数据访问
来源:互联网 发布:全球经济增长数据 编辑:程序博客网 时间:2024/06/04 01:12
获取某一坐标的值
cvGetReal1D, cvGetReal2D, cvGetReal3D, cvGetRealND; 对单通道进行访问
CVAPI(double) cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 );
cvGet1D, cvGet2D, cvGet3D, cvGetND; 对多通道进行访问
CVAPI(CvScalar) cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );
多通道:某一坐标的值都由多个数值组成,如颜色图像RGB;如下:
int main() { float data[18] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; CvMat mat; cvInitMatHeader(&mat, 3, 3, CV_32FC2, data); for(int y = 0; y < mat.rows; y++) { for(int x = 0; x < mat.cols; x++) { CvScalar value = cvGet2D(&mat, y, x); printf("(%5.2f, %5.2f) ", value.val[0], value.val[1]); } printf("\n"); } getchar(); return 0;}
可以看出,数据在内存中的排放顺序是依次存放的;
多维数据
CvMatND,维度可以为多维
int main() { float data[18] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; int size[] = {2,3,3}; CvMatND mat; cvInitMatNDHeader(&mat, 3, size, CV_32FC1, data); for(int z = 0; z < mat.dim[0].size; z++) { for(int y = 0; y < mat.dim[1].size; y++) { for(int x = 0; x < mat.dim[2].size; x++) { int pos[] = {z, y, x}; double value = cvGetRealND(&mat, pos); //double value = cvGetReal3D(&mat, z, y, x); printf("%5.2f ", value); } printf("\n"); } printf("=========\n"); } getchar(); return 0;}
可以用cvGet1D可以访问数据,但是这种方式太慢,因此可以观察数据在内存中的位置而直接访问内存即可;
int main() { float data[18] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; CvMat mat; cvInitMatHeader(&mat, 3, 3, CV_32FC2, data); for(int y = 0; y < mat.rows; y++) { for(int x = 0; x < mat.cols; x++) { float * pData = (float*)(mat.data.ptr + mat.step * x + y * sizeof(CV_32FC2)); printf("(%5.2f, %5.2f) ", pData[0], pData[1]); } printf("\n"); } getchar(); return 0;}
对于多维数组,有类似的结论:
int main() { float data[18] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}; int size[] = {2,3,3}; CvMatND mat; cvInitMatNDHeader(&mat, 3, size, CV_32FC1, data); for(int z = 0; z < mat.dim[0].size; z++) { for(int y = 0; y < mat.dim[1].size; y++) { for(int x = 0; x < mat.dim[2].size; x++) { int pos[] = {z, y, x}; float * pValue = (float *)(mat.data.ptr + z * mat.dim[0].step + y * mat.dim[1].step + x * sizeof(CV_32FC1)); printf("%5.2f ", pValue[0]); } printf("\n"); } printf("=========\n"); } getchar(); return 0;}
阅读全文
0 0
- OPENCV 4. 矩阵维度、通道和数据访问
- Study notes for OpenCV——第九节 矩阵的维度、通道和矩阵的访问
- 2.3 访问CvMat数据块(矩阵维度与通道)
- Opencv矩阵的维度与通道
- 矩阵维度与通道
- openCV 指针访问多通道矩阵
- Opencv 多通道矩阵的访问
- opencv访问图片单个像素和通道
- OpenCV 矩阵数据访问方法
- opencv中的多通道矩阵CvMat元素的访问
- 矩阵与维度通道的介绍
- [opencv]图像处理的基本数据类型以及通道和维度理解
- 【OpenCV学习】多通道矩阵的赋值和取值
- opencv多通道数据和多维数据的区别
- OpenCV 深度和通道
- opencv打印二通道或三通道矩阵
- OpenCV 矩阵访问
- OpenCV 矩阵访问
- python链接爬虫案例
- MATLAB2012a反复激活
- ECS下CentOS系统中WEB的基本配置(也适用于VM)
- C++——类型转换
- 从 Python到Tensorflow 学习之路(一)
- OPENCV 4. 矩阵维度、通道和数据访问
- Builder模式设置AlertDialog字体大小、颜色等属性
- SQLHelper助手类【代码】
- 基础练习 字母图形
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用015-Flink中广播变量和分布式缓存001
- php的十六个魔术方法
- Advanced Programming in UNIX Environment Episode 17
- Matlab 绘图时hold on 和hold off用法
- 剑指OFFER——判断一棵树是否是平衡二叉树 java实现