失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【OpenCV学习笔记】【函数学习】二十(访问图像像素)

【OpenCV学习笔记】【函数学习】二十(访问图像像素)

时间:2023-08-01 12:42:13

相关推荐

【OpenCV学习笔记】【函数学习】二十(访问图像像素)

假设现在需要访问第k通道、第i行,第j列的像素,可以有如下的间接直接访问两种方式:

1. 间接访问(单通道字节型图像)

IplImage *img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

CvScalar s;

S=cvGet2D(img,i,j);//注意本函数中坐标参数的顺序与其它的openCV函数坐标参数顺序恰好相反,本函数中的i代表height,而j代表width

Printf(“intensity=%f\n”,s.val[0]);

s.val[0]=111;

cvSet2D(img,I,j,s); //设置img(J,i)位置的像素值为s

间接访问(多通道字节型/浮点型图像)

IplImage * img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3)

cvScalar s;

s=cvGet2D(img,I,j) //得到(j,i)位置的像素值

printf(“B=%f,G=%f, R=%f\n”,s.val[0],s.val[1],s.val[2]);

S.val[0]=111;

S.val[1]=111;

S.val[2]=111;

cvSet2D(img,I,j,s)//设置img的(j,i)位置的像素的值为s

2. 直接访问(效率很高,但是很容易出错)

单通道字节型图像:

IplImage *img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

((uchar* )(img->imageData+i*img->widthstep))[j]=111;

多通道字节型图像:

IplImage * img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

((uchar*) (img->imageData+i*img->widthStep))[j*img->nChannels+0]=111;

((ucahr *)(img->imageData+i*img->widthStep))[j*img->nChannels+1]=112;

((uchar *)(img->imageData+i*img->widthStep))[j*img->nChannels+2]=113;

多通道浮点型图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

3. 基于指针的直接访问

单通道字节型图像:

IplImage *img=cvCreateImage(cvSIze(640,480),IPL_DEPTH_8U,1)

Int height=img->height;

Int width =img->width;

Int Step =img->widthStep;

Uchar *data =(uchar *)img->imageData

Data[i*setp+j]=111;

多通道浮点型图像(假设图像数据采用4字节(32位)行对齐方式)

IplImage *img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3)

int height =img->height;

int width =img->width;

int step =img->widthStep;

int channels =img->nChanns

float *data =(float *)img->imageData

data[i*step+j*Channels+k]=111

4. 基于C++ wrapper的直接访问(更加简单高效)

首先定义一个C++ wrapper ‘Image’,然后基于Image定义不同类型的图像:

Template class Image

{

Private:

IplImage *imgp;

Public :

Image(IplImage *img=0){imgp=img}

~Image(){imgp=0;}

Void operator=(IplImage *img){imgp=img;}

Inline T * operator[]=(const int rowIndx){

Return ((T *)(imgp->imageData+rowIndx*imgp->widthStep));}

};

Typedef struct{

Unsigned char b,g,r;

}RgbPixel

Typedef struct{

Float b,g,r;

}RgbPixelFloat;

typedef Image RgbImage;

typedef Image RgbImageFloat;

typedef Image BwImage;

typedef imageBwImageFloat;

对于单通道字节型图像:

IplImage *img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1)

BwImage imgA(img);

imgA[i][j]=111;

对于多通道字节型图像:

IplImage * img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

RgbImage imgA(img);

imgA[i][j].b=111;

imgA[i][j].g=111;

imgA[i][j].r=111;

对于多通道浮点型图像

IplImage *img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3)

RgbImageFloat imgA(img);

imgA[i][j].b=111;

imgA[i][j].g=111;

imgA[i][j].r=111;

转自/s/blog_5e3213f301014yc9.html

如果觉得《【OpenCV学习笔记】【函数学习】二十(访问图像像素)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。