一直在看opencv,但都是断断续续,不成体系,知识点过于凌乱,今天第一次作笔记,为了本身更好的理解,也为了有和我同样兴趣的人参考。正文以下: 数组
这篇笔记主要记录一下图像元素的访问: 函数
1.用cvGet2D()和cvSet2D(): spa
cvGet2D()函数的原型:CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ),返回的是一个CvScalar类型的容器,idx0和idx1分别表示的是该点到图像(0,0)点的垂直距离和水平距离,和咱们通常理解的相反。 指针
cvSet2D也相似,只不过加了一个要设置的cvScalar类型的参数
code
例如: 原型
cvScalar test; IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1);//建立一个单通道无符号整形字节图像 test = cvGet2D(image,x,y);//返回的数据赋值给cvScalar类型的test printf("result:%f\n",test.val[0]);//列印出单通道(x,y)的值 cvSet2D(image,x,y,test);//cvSet2D的使用
2.直接访问: opencv
例如: class
IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1); ((uchar*)( image->imageData + i*image->widthStep))[j] = 255;image->imageData:存储图像像素值数组的首地址
image->widthStep:指的是图像每行所占的字节数,这个概念不要和width混淆。(每每由于存储要遵循字节对齐的原则,widthStep并非单纯的像素数*nChannels,每每会更大一点) test
因此由于是单通道的图像,因此(.....)[j]就是(i,j)点的值
容器
3.指针直接访问:
例如:
IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1); int height = image->height; int width = image->width; int widthstep = image->widthStep; uchar* data = (uchar*) image->imageData; data[i*widthstep+j] = 255;这种方法感受像是建立数组指向存储区域,而后对数组操做,省掉了首地址了。我是这么理解的,不知道对不对。
2.直接访问的方式就要加上:
((uchar*)( image->imageData + i*image->widthStep))[j*nChannels+0] = 255;//或者+1,+2分别表示bgr通道的值
3.指针的方式同上一种:
data[i*widthstep+j*nChannels+k] = 255;//k的值为0-通道数
OK,That's all.
第一次写,新手请轻喷!!!
有时间再写绘制函数的笔记好了,内容不多,仅看成本身的复习!!