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;

  • 相关阅读:
    实现连续测试,要做的事情【译】
    Go语言HTTPServer开发的六种实现
    JSON必知必会【PDF+视频教程】
    给JSONObject添加自定义遍历方法
    利用守护线程隐式关闭线程池
    从错误中学习
    Groovy动态添加方法和属性及Spock单测
    持续测试、持续集成、持续交付、持续部署和DevOps
    有关OAuth 2.0简化模式中步骤D-F的解释
    Spring笔记(五):bean的自动装配
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000799.html
Copyright © 2011-2022 走看看