opencv学习笔记2--存取图像元素

最近了解了下如何存取图像元素,在这里归纳总结下,也是记录下,以后需要的时候可以复习下。


假设需要读取在i行j列像点的第k通道. 其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].

 

1.间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)

对单通道字节图像:

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

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_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

3.用指针直接存取 : (在某些情况下简单高效)

对单通道字节图像:

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(uchar);
uchar* data        =(uchar *)img->imageData;
data[i*step+j] = 111;

对多通道字节图像:

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(uchar);
int channels       =img->nChannels;
uchar* data        =(uchar *)img->imageData;
data[i*step+j*channels+k] = 111;

对单通道浮点图像(假设用4字节调整):

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(float);
int channels       =img->nChannels;
float * data        =(float *)img->imageData;
data[i*step+j*channels+k] = 111;

4.使用 c++ wrapper 进行直接存取: (简单高效)

对单/多通道字节图像,多通道浮点图像定义一个 c++ wrapper:

template<class T> classImage
{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<RgbPixel>           RgbImage;
typedef Image<RgbPixelFloat>      RgbImageFloat;
typedef Image<unsigned char>      BwImage;
typedefImage<float>              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://www.mzph.cn/news/409212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)TDI FILTER 网络过滤驱动完全解析

http://blog.csdn.net/charlesprince/article/details/5924376 TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析&#xff0c;记录和管理&#xff0c;可以实现非常强大的管理功能&#xff0c;这里就将讨论它的设计架构&#xff0c;和具体实现的方法。  …

云服务器 怎样修改地域,云服务器 怎样修改地域

云服务器 怎样修改地域 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、…

python 除数总是提示为0_python负数求余不正确?——取模 VS 取余

前天小王同学正在leetcode兴致勃勃的刷题&#xff0c;用java写了一版后又习惯性的用python写了一版&#xff0c;代码逻辑完全一样&#xff0c;但提交答案后居然提示【解答错误】&#xff01;经过反复调试&#xff0c;发现问题出在涉及求余的地方&#xff0c;python和java得出的…

14天学会安卓开发(附PDF文档和全部示例代码)

前言: 本人也是菜鸟,老鸟看了此文有哪里不好之处敬请指点,本书是根据<<Android应用开发揭秘>>攒写的,如何把一本书读薄,是一件值得思考的问题.相信看过那本书的都知道有500页,哪里才是重点呢?我来告诉你!本书针对有JAVA基础的孩纸们,基本JAVA基础都没的,赶紧去找2…

scanf的用法

今天上论坛看到有人问的关于C语言代码中的问题&#xff0c;发现出现了在scanf函数中带有\n&#xff0c;记得当年刚开始学得时候&#xff0c;也出现过类似的问题&#xff0c;然后看到有人归纳了scanf的用法&#xff0c;就转载到自己的blog以方便以后可以复习。 ***************…

qldump 备份所有表_MySQL中的备份和恢复是怎样执行的?

- 点击上方“中国统计网”订阅我吧&#xff01;-MySQL备份MySQL中的逻辑备份是将数据库中的数据备份为一个文本文件&#xff0c;备份的文件可以被查看和编辑。在MySQL中&#xff0c;使用mysaldump工具来完成备份。有以下3种来调用mysqldump&#xff1a;1. 备份指定的数据库&…

将系统默认记事本替换成自己喜欢的文本编辑器

找寻了这么长时间的编辑器&#xff0c;感觉还是Notepad2最适合自己了。打开效率快 界面简洁 并且还能直接按Esc进行关闭这个最喜欢了。只是它的图标有点丑。。 下面就记录一下 将Notepad2替换成系统记事本。 首先&#xff1a;我们将notepad2.exe重命名为notepad.exe并复制一份名…

linux系统管理与服务器配置高志君_如何在 Linux 上安装、配置 NTP 服务器和客户端?...

你也许听说过这个词很多次或者你可能已经在使用它了。在这篇文章中我将会清晰的告诉你 NTP 服务器和客户端的安装。-- Magesh Maruthamuthu你也许听说过这个词很多次或者你可能已经在使用它了。在这篇文章中我将会清晰的告诉你 NTP 服务器和客户端的安装。之后我们将会了解 Chr…

latex使用

目录 工具支持中文方法eps图片转换给目录加上超链接修改文字颜色C代码式样超链接工具 首先&#xff0c;推荐使用ubuntu下的图形界面tex编辑工具Kile&#xff0c;同时该工具支持界面的编辑&#xff0c;与pdf文件的生成。 由于我只需要简单的使用tex文件生成pdf&#xff0c;就可以…

8位可控加减法器_行测高分技巧-资料分析之有效数字加减法取舍

资料分析是我们行测试卷中得分率较高的一个部分&#xff0c;所以对资料分析这一部分的题目我们必须把握。但是做题过程中&#xff0c;考生碰到一些数字较大&#xff0c;列式复杂的题目&#xff0c;就无从下手&#xff0c;不知如何应对&#xff0c;今天陕西京佳教育就和各位考生…

《linux c编程指南》学习手记4

7.1 文件系统简介 7.1.1 文件 文件类型&#xff1a;普通文件、目录文件、链接文件、设备文件、管道文件 文件权限&#xff1a;r w x 访问权限&#xff1a;文件所有者、文件所有者同组用户、其他用户 7.1.2 索引节点 7.1.3 文件系统 树形层次结构系统&#xff0c;文件最终都归结…

3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下

一、VXLAN 简介(1)定义RFC7348 定义了 VLAN 扩展方案 VXLAN(Virtual eXtensible Local Area Network)。VXLAN 采用 MAC in UDP(User Datagram Protocol)封装方式&#xff0c;是 NVO3(Network Virtualization overLayer 3)中的一种网络虚拟化技术。(2)目的作为云计算的核心技术之…

android shape的用法总结

<?xml version"1.0" encoding"utf-8"?><shape xmlns:android"http://schemas.android.com/apk/res/android"> <gradient android:startColor"#c0000000" android:endColor"#c0000000" …

设置dns_网络速度缓慢怎么办?轻松一键修改DNS设置让网速提升五倍

不知道大家有没有这种情况的发生&#xff0c;在家上网或者看智能电视&#xff0c;打开一个普通网页&#xff0c;明明自己办的是100M的宽带&#xff0c;结果慢得要死&#xff0c;还动不动弹出各种各样的广告&#xff0c;然后这时你又杀毒&#xff0c;又去清内存&#xff0c;结果…