opencv——访问图像元素(imagedata widthstep)
http://blog.sina.com.cn/s/blog_759803690101gtpx.html
怎么访问图像元素
(坐标起点相对于图像原点 image origin 从 0 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL)
假设有 8-bit 1-通道的图像 I (IplImage* img):
I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]
假设有 8-bit 3-通道的图像 I (IplImage* img):
I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3]
I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
如果增加点 (100,100) 的亮度 30 ,那么可以:
CvPoint pt = {100,100};
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3] += 30;
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+1] += 30;
((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+2] += 30;
或者更有效的
CvPoint pt = {100,100};
uchar* temp_ptr = &((uchar*)(img->imageData + img->widthStep*pt.y))[x*3];
temp_ptr[0] += 30;
temp_ptr[1] += 30;
temp_ptr[2] += 30;
假设有 32-bit 浮点数, 1-通道 图像 I (IplImage* img):
I(x,y) ~ ((float*)(img->imageData + img->widthStep*y))[x]
现在,通用方法:假设有 N-通道,类型为 T 的图像:
I(x,y)c ~ ((T*)(img->imageData + img->widthStep*y))[x*N + c]
或者你可使用宏 CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc )
I(x,y)c ~ CV_IMAGE_ELEM( img, T, y, x*N + c )
也有针对各种图像(包括 4-通道)和矩阵的函数(cvGet2D, cvSet2D), 但是它们都很慢.
--------------------------------------------------------------------------------
如何访问矩阵元素?
方法是类似的 (都是针对 0 起点的列和行)
设有 32-bit 浮点数的实数矩阵 M (CvMat* mat):
M(i,j) ~ ((float*)(mat->data.ptr + mat->step*i))[j]
设有 64-bit 浮点数的复数矩阵 M (CvMat* mat):
Re M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2]
Im M(i,j) ~ ((double*)(mat->data.ptr + mat->step*i))[j*2+1]
设有单通道矩阵,有宏 CV_MAT_ELEM( matrix, elemtype, row, col ), 例如对 32-bit 浮点数的实数矩阵
M(i,j) ~ CV_MAT_ELEM( mat, float, i, j ),
假如初始化 3x3 单位阵:
CV_MAT_ELEM( mat, float, 0, 0 ) = 1.f;
CV_MAT_ELEM( mat, float, 0, 1 ) = 0.f;
CV_MAT_ELEM( mat, float, 0, 2 ) = 0.f;
CV_MAT_ELEM( mat, float, 1, 0 ) = 0.f;
CV_MAT_ELEM( mat, float, 1, 1 ) = 1.f;
CV_MAT_ELEM( mat, float, 1, 2 ) = 0.f;
CV_MAT_ELEM( mat, float, 2, 0 ) = 0.f;
CV_MAT_ELEM( mat, float, 2, 1 ) = 0.f;
CV_MAT_ELEM( mat, float, 2, 2 ) = 1.f;
--------------------------------------------------------------------------------
如何在 OpenCV 中处理我自己的数据
设你有 300x200 32-bit 浮点数 image/array, 也就是对一个有 60000 个元素的数组.
int cols = 300, rows = 200;
float* myarr = new float[rows*cols];
// step 1) initializing CvMat header
CvMat mat = cvMat( rows, cols,
CV_32FC1, // 32-bit floating-point, single channel type
myarr // user data pointer (no data is copied)
);
// step 2) using cv functions, e.g. calculating l2 (Frobenius) norm
double norm = cvNorm( &mat, 0, CV_L2 );
...
delete myarr;
其它情况在参考手册中有描述.见 cvCreateMatHeader, cvInitMatHeader, cvCreateImageHeader, cvSetData etc.
--------------------------------------------------------------------------------
如何加载和显示图像
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* img;
if( argc == 2 && (img = cvLoadImage( argv[1], 1)) != 0 )
{
cvNamedWindow( "Image view", 1 );
cvShowImage( "Image view", img );
cvWaitKey(0); // very important, contains event processing loop inside
cvDestroyWindow( "Image view" );
cvReleaseImage( &img );
return 0;
}
return -1;
}
void cvLaplace (IplImage* src, IplImage* dst, int apertureSize=3);
void cvSobel (IplImage* src, IplImage* dst, int dx, int dy, int apertureSize=3);
void cvCanny (IplImage* img, IplImage* edges, double lowThresh, double highThresh, int apertureSize=3);
void cvPreCornerDetect (IplImage* img, IplImage* corners, Int apertureSize);
void cvCornerEigenValsAndVecs (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3);
void cvCornerMinEigenVal (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3);
void cvGoodFeaturesToTrack (IplImage* image, IplImage* eigImage, IplImage* tempImage, CvPoint2D32f* corners, int* cornerCount, double qualityLevel,double minDistance);
//对已经粗检测出的角点进行亚像素精准定位
void cvFindCornerSubPix (IplImage* img, CvPoint2D32f* corners, int count,CvSize win, CvSize zeroZone, CvTermCriteria criteria);
//金字塔分解与重构
void cvPyrDown (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5);
void cvPyrUp (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5);
void cvThreshold (IplImage* src, IplImage* dst, float thresh, float maxvalue,CvThreshType type);
void cvProject3D ( CvPoint3D32f* points3D, int count, CvPoint2D32f* points2D,int xindx, int yindx);
void cvFindFundamentalMatrix (int* points1, int* points2, int numpoints, int method, CvMatrix3* matrix);
//很好用的平滑函数
void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 );
CV_BLUR_NO_SCALE CV_BLUR CV_GAUSSIAN CV_MEDIAN CV_BILATERAL
其他辅助函数:
void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color );
cvCvtColor(image, gray, CV_BGR2GRAY);//彩色图像灰度化
cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, currentimage);
cvSplit(colorimage,plane[0],plane[1],plane[2],0);
opencv——访问图像元素(imagedata widthstep)相关推荐
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
- OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...
- OpenCV访问Mat图像中每个像素的值
原文:http://blog.csdn.net/xiaowei_cqu/article/details/7771760 matlab中, a=[1,2,3;4,5,6;7,8,9] a(1,2) 第一 ...
- OpenCV中6种访问Mat元素的方法
Mat中不管是以at访问还是ptr访问,都是行优先 ,先Y轴后X轴(即先行后列) 1.使用at访问 /* *OpenCV2中Mat的at操作访问矩阵元素 * */#include <highgu ...
- OpenCV学习笔记(七):访问图像中像素的三类方法
该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...
- OpenCV学习笔记(二):3种常用访问图像中像素的方式
OpenCV学习笔记(二):3种常用访问图像中像素的方式 #include <opencv2/opencv.hpp>using namespace cv; using namespace ...
- 【OpenCV】OpenCV实战从入门到精通之 -- 访问图像中的像素
目录 1.图像在内存之中的存储方式 2.颜色空间缩减 3.LUT函数:Look up table操作 4.计时函数 5.访问图像中像素的三类方法 5.1.指针访问像素 5.2.迭代器操作像素 5.3. ...
- OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式...
OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式 以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列 ...
- 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合
1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...
- 学习javacv入门示例2:访问Mat元素,对图像加盐处理
Mat作为图像的逻辑结构,是二维多通道的.如何访问图像的元素,以及像素的各个通道,是本文的重点. package com.linghushaoxia.javacv.chapter02;import s ...
最新文章
- Kaldi内存泄漏问题排查
- Maven开发web项目的搭建
- Android:SharedPreferences详解+示例
- 救命神文!应对ubuntu磁盘空间不足(已解决)
- SaaS市场没有免费午餐!未来只有两种企业可生存
- u检验中的查u界值表_延边双壁波纹管pvc-u
- 应用搬家:如何将软件从C盘迁移到D盘?
- 1047: 对数表 Java
- 内存带宽测试程序——stream2-C语言版
- clickhouse-client命令行参数及常用案例
- Cesium实现聚光灯向舞台照射并旋转运动的效果含全部源码
- RHCE投资失败!需要及时止损
- 倉頡造字(歌詞+注釋)
- 基于CAPE-OPEN标准开发化工模拟单元操作模块
- HTML精仿ios相册,高仿ios相册地图功能
- Gson按指定字段顺序序列化
- c# 不规则透明窗体
- ThinkCMF报错未定义变量vo
- 马斯克卸任推特CEO?谁赞成谁反对!
- 初级前端-react学习(1)