下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、opencv 中文站中有一篇关于 opencv 基础操作的文章opencv 编程简介(矩阵/图像/ 视频的基本读写操作)入门必读,上面对 opencv 的一些入门操作进行了具体的介绍。我也是看了这篇文章后才开头了 opencv 的编程。但是最近发觉了一个理解上的小失误,导致一个问题困扰了很长时间。现在问题解决了,就把思考的过程写在这跟大家共享一下。该文章其中有一部分是关于如何操作图像像素值的介绍: 基于指针的直接访问:(简洁高效)iplimage* img = cvcreateimage(cvsize(640,480),ipl_depth_8u,1);int height = img->
2、height; int width = img->width;int step = img->widthstep/sizeof(uchar); uchar* data = (uchar *)img->imagedata; datai*step+j = 111;对像素值的访问,作者用了 datai*step+j这样的格式,当时没怎么认真想,就认为这是图像中坐标为(i, j)像素的值,其实并不是这样的。首先,来看一下iplimage 的结构,其中像素值存放在char *imagedata 指针做指向的区域,opencv 官方文档中将其解释为“a pointer to the al
3、igned image data“,就是指向排列好的图像数据的指针。但是指针取出来,是一个一维数组 datai*step+j,是怎么体现出“排列好的”这共性质的呢? opencv 用了一个关心的变量来实现。就是 iplimage 的widthstep,它表示图像一行有多少个字节。用这个值除以一个像素所占的字节数,就可以 得到一行有多少个像素。datai*step+j就是第 i 行第j 个像素的像素值(i 和 j 从 0 开头, 这个应当不用我说吧)。但是,假如用(i, j)来表示坐标的话,正好反了。由于行号是在列的方向递增的。比如说第 5 行,那么它的纵坐标应当是 5-1。第五行的第几个,这个
4、几才代表横坐标。明白了这点就好办了,假如想用(i, j)同时来表示坐标和数组中的点,那么应当用datai+j*step。i 在图像宽度范围内递增,j 在图像高度范围内递增。假如图像宽和高非别为 w 和 h,那么对像素的遍历可以用下面的循环搞定:for(int j = 0; j < h; j+) for(int i = 0; i < w; i+) printf(“(%d, %d)=%dt“, i, j, datai+j*step);以后就定义成 datai+j*step,便利后面的操作。一般状况下还是习惯 i 在前、j 在后的格式。( 坐标是从 0 开头的, 并且是相对图像原点的位置
5、。 图像原点或者是左上角(img->origin=ipl_origin_tl) 或者是左下角 (img->origin=ipl_origin_bl) )· 假设有 8-bit 1通道的图像 i (iplimage* img):i(x,y) (uchar*)(img->imagedata + img->widthstep*y)x· 假设有 8-bit 3-通道的图像 i (iplimage* img): i(x,y)blue (uchar*)(img->imagedata + img->widthstep*y)x*3i(x,y)green
6、(uchar*)(img->imagedata + img->widthstep*y)x*3+1 i(x,y)red (uchar*)(img->imagedata + img->widthstep*y)x*3+2 例如,给点 (100,100) 的亮度增加 30 ,那么可以这样做:cvpoint pt = 100,100;(uchar*)(img->imagedata + img->widthstep*pt.y)pt.x*3 += 30; (uchar*)(img->imagedata + img->widthstep*pt.y)pt.x*3+
7、1 += 30; (uchar*)(img->imagedata + img->widthstep*pt.y)pt.x*3+2 += 30; 或者更高效地:cvpoint pt = 100,100;uchar* temp_ptr = &(uchar*)(img->imagedata + img->widthstep*pt.y)pt.x*3; temp_ptr0 += 30;temp_ptr1 += 30;temp_ptr2 += 30;· 假设有 32-bit 浮点数, 1-通道 图像 i (iplimage* img):i(x,y) (float*)
8、(img->imagedata + img->widthstep*y)x· 现在,一般的状况下,假设有 n-通道,类型为 t 的图像:i(x,y)c (t*)(img->imagedata + img->widthstep*y)x*n + c 你可以使用宏 cv_image_elem( image_header, elemtype, y, x_nc ) i(x,y)c cv_image_elem( img, t, y, x*n + c )也有针对各种图像(包括 4 通道图像)和矩阵的函数( cvget2d, cvset2d ), 但是它们格外慢。如何访问矩阵元
9、素?方法是类似的(下面的例子都是针对 0 起点的列和行)· 设有 32-bit 浮点数的实数矩阵 m (cvmat* mat): m(i,j) (float*)(mat->data.ptr + mat->step*i)j· 设有 64-bit 浮点数的复数矩阵 m (cvmat* mat):re m(i,j) (double*)(mat->data.ptr + mat->step*i)j*2 im m(i,j) (double*)(mat->data.ptr + mat->step*i)j*2+1· 对单通道矩阵,有宏 cv_m
10、at_elem( matrix, elemtype, row, col ), 例如对 32-bit浮点数的实数矩阵:m(i,j) cv_mat_elem( mat, float, i, j ),例如,这儿是一个 3x3 单位矩阵的初始化:cv_mat_elem(mat,float,0,0) =1.f;cv_mat_elem(mat,float,0,1) =0.f;cv_mat_elem(mat,float,0,2) =0.f;cv_mat_elem(mat,float,1,0) =0.f;cv_mat_elem(mat,float,1,1) =1.f;cv_mat_elem(mat,float
11、,1,2) =0.f;cv_mat_elem(mat,float,2,0) =0.f;cv_mat_elem(mat,float,2,1) =0.f;cv_mat_elem(mat,float,2,2) =1.f;opencv 中猎取图像某一像素值 保藏this is a basic example for the opencv.first we must know the structure of iplimage:ipl image:iplimage|- int nchannels; / number of color channels (1,2,3,4)|- int depth; / p
12、ixel depth in bits:| / ipl_depth_8u, ipl_depth_8s,| / ipl_depth_16u,ipl_depth_16s,| / ipl_depth_32s,ipl_depth_32f,| / ipl_depth_64f|- int width; / image width in pixels|- int height; / image height in pixels|- char* imagedata; / pointer to aligned image data| / note that color images are stored in b
13、gr order|- int dataorder; / 0 - interleaved color channels,| / 1 - separate color channels| / cvcreateimage can only create interleaved images|- int origin; / 0 - top-left origin,| / 1 - bottom-left origin (windows bitmaps style)|- int widthstep; / size of aligned image row in bytes|- int imagesize;
14、 / image data size in bytes = height*widthstep|- struct _iplroi *roi;/ image roi. when not null specifies image| / region to be processed.|- char *imagedataorigin; / pointer to the unaligned origin of image data| / (needed for correct image deallocation)|- int align; / alignment of image rows: 4 or
15、8 byte alignment| / opencv ignores this and uses widthstep instead|- char colormodel4; / color model - ignored by opencv/-int main(int argc, char* argv).iplimage *img=cvloadimage(“c:/fruitfs.bmp“,1); cvscalar s;for(int i=0;i<img->height;i+). for(int j=0;j<img->width;j+).s=cvget2d(img,i,j); / get the (i,j) pixel value printf(“b=%f, g=%f, r=%f “,s.val0,s.val1,s.val2); s.val0=111;s.val
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年西安市经开第三中学教师招聘笔试真题
- 销售树木合同范本
- 鸡毛信的故事演讲稿
- 宴会的祝酒词(3篇)
- 给同学的唯美毕业赠言(8篇)
- 物业公司客服助理年度总结(3篇)
- 2023年宁波市眼科医院招聘高层次紧缺人才笔试真题
- 2024年IVL检测系统项目合作计划书
- 2023年江苏无锡工艺职业技术学院招聘笔试真题
- 2023年湖州吴兴城市更新建设发展集团有限公司招聘笔试真题
- 人教版 九年级上册音乐 第五单元 大红枣儿甜又香 教案
- 在线网课知道知慧《灾害学(山东科大)》单元测试答案
- 2024年宁波市奉化区文化旅游集团有限公司招聘笔试冲刺题(带答案解析)
- 统编版教材一至六年级日积月累
- 2024年新修订公司法知识题库及答案
- 台球厅桌球俱乐部创业计划书课件模板
- 口腔科医疗污水处置登记表
- 习近平总书记教育重要论述讲义智慧树知到期末考试答案章节答案2024年西南大学
- 喉恶性肿瘤教学查房
- 北师大版四年级上册数学好玩
- 2024年共青团入团考试题库(附答案)
评论
0/150
提交评论