假设现在需要访问第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
间接访问(多通道字节型/浮点型图像)
I plImage * 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定义不同类型的图像:
T emplate 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 image BwImageFloat;
对于单通道字节型图像:
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;
转自http://blog.sina.com.cn/s/blog_5e3213f301014yc9.html