注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Aspirer's blog

停止维护,新博客地址:http://aspirer.wang/

 
 
 

日志

 
 

opencv IplImage、CvMat型数组单通道元素值的读取方法及示例  

2009-05-04 15:34:26|  分类: 学习心得 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

opencv IplImage、CvMat型数组单通道元素值的读取方法及示例 - aspirer - Aspirers blog

 

下面是本人经过修改文中原始代码,编写的获取CvArr型数组元素值的代码,请大家验证后使用。

/*获取IplImage型图像像素值,可以读取或设置单个通道的值*/
template <typename T>
class Read_Image_Pix
{
private:
 IplImage* imgp;
public:
 Read_Image_Pix(IplImage* img=NULL)
 {
  imgp=img;
 }
 ~Read_Image_Pix()
 {
  imgp=NULL;
 }
 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;
} BgrPixelUc;

typedef struct
{
 unsigned char y, cr, cb;
} YCrCbPixelUc;

typedef struct
{
 float b,g,r;
} BgrPixelFloat;

typedef struct
{
 float y, cr, cb;
} YCrCbPixelFloat;

//获取BGR色彩空间unsigned char型像素值
typedef Read_Image_Pix< BgrPixelUc > GetUcBgrImgPix;

//获取BGR色彩空间float型像素值
typedef Read_Image_Pix< BgrPixelFloat > GetFloatBgrImgPix;

//获取YCrCb色彩空间unsigned char型像素值
typedef Read_Image_Pix< YCrCbPixelUc > GetUcYCrCbImgPix;

//获取YCrCb色彩空间float型像素值
typedef Read_Image_Pix< YCrCbPixelFloat > GetFloatYCrCbImgPix;

//获取灰度图像unsigned char型像素值
typedef Read_Image_Pix< unsigned char > GetUcGrayImgPix;

//获取灰度图像float型像素值
typedef Read_Image_Pix< float > GetFloatGrayImgPix;
/*获取IplImage图像像素值代码结束*/

 


/***********************************************************
*GetCVMatOneCh();
*获取CvMat型矩阵元素的单通道元素值;
************************************************************/


/*获取CvMat型矩阵元素的单通道元素值,可以读取或设置单个通道的值*/
template < typename T >
inline T &GetCvMatOneCh(const CvMat *model,  //输入CvMat矩阵
             const int row,   //行
             const int col,          //列     
             const int channel_no,   //要获取的通道号,从0开始
             const T return_typeconst,  //返回类型,注意一定要与输入矩阵存储的类型相同,否则会返回错误元素值!
             int total_channels = 3)    //通道总数,默认为3
{
 return ( T( *( (T *) (model->data.ptr+ row * model->step)  //定位到行
         + col * total_channels  //定位到列
         + channel_no) ) );    //定位到通道
 }
/*获取CvMat型矩阵元素的单通道元素值代码结束*/

 


用法示例:

 

GetUcGrayImgPix image(img);//其中img为IplImage型图像数组,元素类型为unsigned char,单通道灰度图。

用法:image[row][col]得到元素值。

GetUcBgrImgPix image(img);//其中img为IplImage型图像数组,元素类型为unsigned char,3通道灰度图。

用法:image[row][col].b 或(.g)(.r)得到元素第一、二、三通道值(注意opencv里面的通道顺序为bgr)。

根据不同的图像类型使用不同函数Get…类。

 

GetCvMatOneCh(CvMat, row, col, 0, 0.0f, 3) //返回CV_32FC3类型矩阵中下标为(row, col)的第一个通道元素值。返回类型必须有,且必须标清楚。

 

返回元素所有通道值:

CvScalar imgPixValue = cvGet2D(CvMat, index0, index1);//返回二维矩阵下标为(index0, index1)的所有通道值,最多4个通道。imgPixValue.val[i]得到第i个通道的值。

cvSet2D(CvMat, index0, index1, imgPixValue);//将CvScalar类型的多个通道的像素值存入CvMat矩阵,最多4通道,imgPixValue.val[i]得到第i个通道的值。

  评论这张
 
阅读(4749)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018