假设现在需要访问第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

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

  1. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  2. OpenCV学习笔记(七):访问图像中像素的三类方法

    该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...

  3. 【GANs学习笔记】(二十四)StyleGAN

    完整GANs笔记:http://www.gwylab.com/note-gans.html StyleGAN详细解读:http://www.gwylab.com/pdf/Note_StyleGAN.p ...

  4. 《Effective Modern C++》学习笔记之条款二十五:针对右值引用实施std::move,针对万能引用实施std::forward

    我们知道,一个函数接受一个右值引用参数后将变成左值(可以对其取地址),所以如果在函数内部想要继续使用其右值属性,就可以对其实施std::move,将形参左值转换为右值. 而对于万能引用,因为其实参可能 ...

  5. 【前端学习笔记 CSS系列二十二】justify

    一.效果 二.代码 <!DOCTYPE html> <html><head><meta charset="utf-8"><ti ...

  6. 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分

    学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...

  7. # java学习笔记 2020 2/8(十二)慕课网 构造方法

    java学习笔记 2020 2/8(十二)慕课网 构造方法 构造方法是一种特殊的方法,它是一个与类同名的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会 ...

  8. Python基础学习笔记之(二)

    Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...

  9. Kinect开发学习笔记之(二)Kinect开发学习资源整理

    Kinect开发学习笔记之(二)Kinect开发学习资源整理 zouxy09@qq.com http://blog.csdn.net/zouxy09 刚刚接触Kinect,在网上狂搜资料,获得了很多有 ...

  10. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

最新文章

  1. socket编程listen函数限制连接数的解决方案_网络编程——服务器篇
  2. c#操作word表格
  3. 指针结构体函数-事实上能够这样具体理解
  4. python中发送带附件的邮件,python SMTP实现发送带附件电子邮件
  5. ubuntu下安装latex
  6. 朋友圈、浏览器分享实现
  7. 宝塔linux_Linux虚拟机上快速搭建宝塔 部署PHP运行环境
  8. python replace函数后面的数字的含义
  9. 批量部署 自动化之 - [pssh](转)
  10. BZOJ4892:[TJOI2017]dna(hash)
  11. Tensorflow参数初始化很慢的问题
  12. ScriptManager的EnablePageMethods
  13. 【程序人生】程序员接私活常用平台汇总
  14. java中常用的json转换工具类
  15. 易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究
  16. layuiadmin配置mysql_layuiAdmin 后台管理模板
  17. SpringMVC中session的使用
  18. yigo2.0定时器集合
  19. ai黑白棋_AI的黑白镜
  20. Chrome 55 浏览器推出 Android 离线下载功能

热门文章

  1. 25. 二叉树中和为某一个值的路径(C++版本)
  2. vlc插件怎么用 wpf_使用Vlc.DotNet在我的WPF项目中添加vlc的问题。
  3. php裁剪圆形,imagemagick裁剪圆形
  4. zeppelin 连接hive 认证方式_HIVE的学习之路(六)Hive的分组Join排序
  5. sql不写parametertype_Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同...
  6. python扫雷代码_没有Python不能做的游戏,这些都可以做(附赠大型游戏开发源码)...
  7. ios ipad适配_安卓和iOS的APP在开发时有哪些区别?
  8. 《高效能程序员的修炼》——程序员的八种境界
  9. 随手记_unbuntu从命令行进入图形界面
  10. 深度学习笔记(一)——初步理解yoloV3原理