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;

  • 相关阅读:
    java例程练习(简单的画图程序[鼠标事件处理])
    java例程练习(事件监听机制)
    java例程练习(布局管理器[FlowLayout])
    java例程练习(网络编程[简单UDP通信试验])
    java例程练习(BorderLayou&GridLayout)
    java例程练习(关于内部类的一个非常重要的作用)
    java例程练习(Graphics类[paint()方法])
    java例程练习(TextField)
    Service Broker 常见问题
    ubuntu8.04 和 Fedora 9
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000799.html
Copyright © 2011-2022 走看看