• OpenCV 中的三大数据类型:IplImage 类型


    前言

      本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧。

      更多的矩阵处理函数还请参阅相关资料。

    IplImage 的类型定义

     1 typedef struct _IplImage
     2 {
     3     int nSize; /* IplImage大小 */
     4     int ID; /* 版本 (=0)*/
     5     int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
     6     int alphaChannel; /* 被OpenCV忽略 */
     7     int depth; /* 像素的位深度,主要有以下支持格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S,
     8     IPL_DEPTH_32F 和IPL_DEPTH_64F */
     9     char colorModel[4]; /* 被OpenCV忽略 */
    10     char channelSeq[4]; /* 同上 */
    11     int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
    12     只有cvCreateImage可以创建交叉存取图像 */
    13     int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
    14     int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */
    15     int width; /* 图像宽像素数 */
    16     int height; /* 图像高像素数*/
    17     struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,
    18     只对该区域进行处理 */
    19     struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */
    20     void *imageId; /* 同上*/
    21     struct _IplTileInfo *tileInfo; /*同上*/
    22     int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/
    23     char *imageData; /* 指向排列的图像数据 */
    24     int widthStep; /* 排列的图像行大小,以字节为单位 */
    25     int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/
    26     int BorderConst[4]; /* 同上 */
    27     char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
    28 } IplImage;

    IplImage 的创建方法

      创建图像函数:

    1 IplImage* cvCreateImage( CvSize size, int depth, int channels );

      size:图像大小

      depth:图像深度,其格式一般为 IPL_DEPTH_<比特数>(S|U|F),比如 IPL_DEPTH_32F 就表示 32 位浮点数。

      channels:图像通道数

    使用 ROI 参数控制图像的处理操作

      这个参数可以翻译为 "对图像感兴趣的区域" ,也就是说,当你给 IplImage 设定了这个参数以后,那么以后的图像处理函数将都只针对这个区域进行,直到撤销此参数。下面的代码设定 ROI 并将此区域的蓝色通道增加一定灰度值:

     1 // 此头文件包含图像IO函数的声明
     2 #include "highgui.h"
     3  // 此头文件包含基本的图像处理函数和高级计算机视觉算法
     4 #include "cv.h"
     5 
     6 int main (void) {
     7     
     8     IplImage *img = cvLoadImage("d:\1.jpg");
     9 
    10     // ROI 位置描述参数
    11     int x = 230;
    12     int y = 60;
    13     int width = 260;
    14     int heigh = 230;
    15 
    16     // 需要增加的蓝色灰度值
    17     int add = 1500;
    18 
    19     // 设定 ROI
    20     cvSetImageROI (
    21         img, // 处理的图像
    22         cvRect (x, y, width, heigh)    // ROI 位置描述
    23     );
    24     // 给图像增加蓝色通道的灰度值
    25     cvAddS (
    26         img,// 处理的图像( 仅仅处理ROI )
    27         cvScalar (add),// 要增加的标量
    28         img    // 输出的图像
    29     );
    30 
    31     // 撤销 ROI
    32     cvResetImageROI (img);
    33 
    34     // 显示处理后的图像
    35     cvNamedWindow ("示例", CV_WINDOW_AUTOSIZE);
    36     cvShowImage ("示例", img);
    37 
    38     // 用户键入任何按键后程序退出
    39     cvWaitKey (0);
    40 
    41     // 清理内存空间
    42     cvReleaseImage (&img);
    43     cvDestroyWindow ("示例");
    44 
    45     return 0;
    46 }

    运行测试

      1. 将如下测试图片另存到 D 盘,命名为 "1.jpg":

      

      2. 运行结果:

      

    IplImage 的其他操作

      请参考前面的文章 OpenCV 入门示例之一,之四,之五,以及相关资料都提供了很多基本的图像处理函数。

      这些基本的函数处理不再介绍也没有必要,查阅相关资料即可,接下来将学习一些更高级的图像处理,分析技术。

  • 相关阅读:
    UOJ#80. 二分图最大权匹配 模板
    BZOJ2243: [SDOI2011]染色
    LA5713 Qin Shi Huang's National Road System
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    LA5009 Error Curves
    BZOJ1013: [JSOI2008]球形空间产生器sphere
    BZOJ2733: [HNOI2012]永无乡
    BZOJ1552: [Cerc2007]robotic sort
    BZOJ3223: Tyvj 1729 文艺平衡树
    网络流24题(24/24)
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3734190.html
Copyright © 2020-2023  润新知