zoukankan      html  css  js  c++  java
  • Opencv中访问图像数据类型

    Opencv中访问数据类型,如下:

    (1) 假设你要访问第k通道、第i行、第j列的像素。
    (2) 间接访问: (通用,但效率低,可访问任意格式的图像)
    对于单通道字节型图像:
    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
    CvScalar s;
    s=cvGet2D(img,i,j); // get the (j,i) pixel value, 注意cvGet2D与cvSet2D中坐标参数的顺序与其它opencv函数坐标参数顺序恰好相反.本函数中i代表y轴,即height;j代表x轴,即weight.
    printf("intensity=%f ",s.val[0]);
    s.val[0]=111;
    cvSet2D(img,i,j,s); // set the (j,i) pixel value
    对于多通道字节型/浮点型图像:
    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
    CvScalar s;
    s=cvGet2D(img,i,j); // get the (j,i) pixel value
    printf("B=%f, G=%f, R=%f ",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 (j,i) pixel value

    (3) 直接访问: (效率高,但容易出错)
    对于单通道字节型图像:
    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

    (4) 基于指针的直接访问: (简单高效)
    对于单通道字节型图像:
    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字节(32位)行对齐方式):
    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;

  • 相关阅读:
    multiprocessing 源码解析 更新中......
    loadrunner 更新中......
    Java IO
    echarts水球图小数点不显示问题+组件默认值
    双柱表格组件
    表格生成后修改echarts图表样式
    vue中引入单张图片+两张壁纸手动切换
    配置全局组件
    vue使用babel-plugin-import按需引入Ant Design View + babel-plugin-component按需引入element-ui
    vue深浅拷贝的思索
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000799.html
Copyright © 2011-2022 走看看