opencv访问图像像素
对于单通道字节型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("intensity=%f\n",s.val[0]);
s.val[0]=111;
cvSet2D(img,i,j,s); // set the (i,j) pixel value
对于多通道字节型/浮点型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
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); // set the (i,j) pixel value
对于单通道字节型图像:
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_8U,3);
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 0]=111; // B
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 1]=112; // G
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 2]=113; // R
对于多通道浮点型图像:
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
对于单通道字节型图像:
IplImage* img
int height
int width
int step
uchar* data
data[i*step+j] = 111;
对于多通道字节型图像:
IplImage* img
int height
int width
int step
int channels
uchar* data
data[i*step+j*channels+k] = 111;
对于多通道浮点型图像(假设图像数据采用4字节(32位)行对齐方式):
IplImage* img
int height
int width
int step
int channels
float * data
data[i*step+j*channels+k] = 111;
(5)基于 c++wrapper 的直接访问: (更简单高效)
首先定义一个 c++ wrapper ‘Image’,然后基于Image定义不同类型的图像:
template class Image
{
};
typedef struct{
} RgbPixel;
typedef struct{
} RgbPixelFloat;
typedef Image
typedef Image
typedef Image
typedef Image
对于单通道字节型图像:
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[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;