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;

  • 相关阅读:
    离奇的软件开发之路
    集群环境中的单例设计模式
    Android 如何更换屏幕上锁界面背景图片
    基于华为Java编程规范的Eclipse checkStyle.xml
    对数据库事务的总结
    [Sciter系列] MFC下的Sciter–1.创建工程框架
    Android 如何添加一种锁屏方式
    Hibernate级联操作 注解
    linux就是这个范儿之融于心而表于行(1)
    Android 如何修改默认的searchable items。
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000799.html
Copyright © 2011-2022 走看看