【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
【OpenCV学习笔记】【函数学习】二十(访问图像像素)相关推荐
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- OpenCV学习笔记(七):访问图像中像素的三类方法
该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...
- 【GANs学习笔记】(二十四)StyleGAN
完整GANs笔记:http://www.gwylab.com/note-gans.html StyleGAN详细解读:http://www.gwylab.com/pdf/Note_StyleGAN.p ...
- 《Effective Modern C++》学习笔记之条款二十五:针对右值引用实施std::move,针对万能引用实施std::forward
我们知道,一个函数接受一个右值引用参数后将变成左值(可以对其取地址),所以如果在函数内部想要继续使用其右值属性,就可以对其实施std::move,将形参左值转换为右值. 而对于万能引用,因为其实参可能 ...
- 【前端学习笔记 CSS系列二十二】justify
一.效果 二.代码 <!DOCTYPE html> <html><head><meta charset="utf-8"><ti ...
- 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分
学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...
- # java学习笔记 2020 2/8(十二)慕课网 构造方法
java学习笔记 2020 2/8(十二)慕课网 构造方法 构造方法是一种特殊的方法,它是一个与类同名的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会 ...
- Python基础学习笔记之(二)
Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...
- Kinect开发学习笔记之(二)Kinect开发学习资源整理
Kinect开发学习笔记之(二)Kinect开发学习资源整理 zouxy09@qq.com http://blog.csdn.net/zouxy09 刚刚接触Kinect,在网上狂搜资料,获得了很多有 ...
- Linux性能优化实战学习笔记:第四十六讲=====实战分析
Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...
最新文章
- socket编程listen函数限制连接数的解决方案_网络编程——服务器篇
- c#操作word表格
- 指针结构体函数-事实上能够这样具体理解
- python中发送带附件的邮件,python SMTP实现发送带附件电子邮件
- ubuntu下安装latex
- 朋友圈、浏览器分享实现
- 宝塔linux_Linux虚拟机上快速搭建宝塔 部署PHP运行环境
- python replace函数后面的数字的含义
- 批量部署 自动化之 - [pssh](转)
- BZOJ4892:[TJOI2017]dna(hash)
- Tensorflow参数初始化很慢的问题
- ScriptManager的EnablePageMethods
- 【程序人生】程序员接私活常用平台汇总
- java中常用的json转换工具类
- 易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究
- layuiadmin配置mysql_layuiAdmin 后台管理模板
- SpringMVC中session的使用
- yigo2.0定时器集合
- ai黑白棋_AI的黑白镜
- Chrome 55 浏览器推出 Android 离线下载功能
热门文章
- 25. 二叉树中和为某一个值的路径(C++版本)
- vlc插件怎么用 wpf_使用Vlc.DotNet在我的WPF项目中添加vlc的问题。
- php裁剪圆形,imagemagick裁剪圆形
- zeppelin 连接hive 认证方式_HIVE的学习之路(六)Hive的分组Join排序
- sql不写parametertype_Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同...
- python扫雷代码_没有Python不能做的游戏,这些都可以做(附赠大型游戏开发源码)...
- ios ipad适配_安卓和iOS的APP在开发时有哪些区别?
- 《高效能程序员的修炼》——程序员的八种境界
- 随手记_unbuntu从命令行进入图形界面
- 深度学习笔记(一)——初步理解yoloV3原理