博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCv访问图像像素
阅读量:4880 次
发布时间:2019-06-11

本文共 2450 字,大约阅读时间需要 8 分钟。

假设你要访问第K通道,第i行,第j列的像素

一 间接访问:(通用,但效率低,可访问任意格式的图像)

对于单通道字节型图像:

1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 2 CvScalar s;3  s=cvGet2D(img,i,j); // get the (j,i) pixel value, 注意cvGet2D与cvSet2D中坐标参数的顺序与其它opencv函数坐标参数顺序恰好相反.本函数中i代表y轴,即height;j代表x轴,即weight.也即先cvGet2D的第二个参数i表示行号,第三个参数j表示列号。而元素的坐标值的(j,i) printf("intensity=%f\n",s.val[0]);4  s.val[0]=111; 5 cvSet2D(img,i,j,s); // set the (j,i) pixel value

对于多通道字节型/浮点型图像:

1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 2 CvScalar s; 3 s=cvGet2D(img,i,j); // get the (j,i) pixel value 4 printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); 5 s.val[0]=111; 6 s.val[1]=111; 7 s.val[2]=111; 8 cvSet2D(img,i,j,s); // set the (j,i) pixel value

 

二 直接访问:(效率高,但容易出错)

对于单通道字节型图像:

1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 2 ((uchar *)(img->imageData + i*img->widthStep))[j]=111;

对于多通道字节型图像:

1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 2 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B 3 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G 4 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

对于多通道浮点型图像:

1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 2 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B 3 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G 4 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

 

三 基于指针的直接访问:(简单高效)

对于单通道字节型图像:

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

对于多通道字节型图像:

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

对于多通道浮点型点型图像(假设图像数据采用4字节(32位)行对齐方式):

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

 

转载于:https://www.cnblogs.com/uriboyka/archive/2013/04/23/3038788.html

你可能感兴趣的文章
转-WebView loadData与loadDataWithBaseURL用法、区别
查看>>
.NET判断某一年的所有放假的日期
查看>>
codevs 等差数列
查看>>
HW2.11
查看>>
careercup-中等难度 17.9
查看>>
Macbook 的 print screen 是什么
查看>>
bjposition
查看>>
Adb的使用笔记-logcat
查看>>
Android开发之SlidingMenu开源项目的使用和问题
查看>>
css常用效果总结
查看>>
linux 常用命令总结(二)
查看>>
codeforces 422A A. Borya and Hanabi(暴力)
查看>>
ADO.NET Entity Framework之ESQL
查看>>
mysql应用学习-在cmd命令窗口下创建数据库和表
查看>>
Docker镜像
查看>>
python装饰器,闭包函数
查看>>
BZOJ 1024:[SCOI2009]生日快乐【DFS】
查看>>
Smarty变量调节器
查看>>
java代码,在linux上删除文件
查看>>
jquery page
查看>>