【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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值