IplImage介绍

typedef struct _IplImage
{int  nSize;             /* sizeof(IplImage) */int  ID;                /* version (=0)*/int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */int  alphaChannel;      /* Ignored by OpenCV */int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */char colorModel[4];     /* Ignored by OpenCV */char channelSeq[4];     /* ditto */int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.cvCreateImage can only create interleaved images */int  origin;            /* 0 - top-left origin,1 - bottom-left origin (Windows bitmaps style).  */int  align;             /* Alignment of image rows (4 or 8).OpenCV ignores it and uses widthStep instead.    */int  width;             /* Image width in pixels.                           */int  height;            /* Image height in pixels.                          */struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */struct _IplImage *maskROI;      /* Must be NULL. */void  *imageId;                 /* "           " */struct _IplTileInfo *tileInfo;  /* "           " */int  imageSize;         /* Image data size in bytes(==image->height*image->widthStepin case of interleaved data)*/char *imageData;        /* Pointer to aligned image data.         */int  widthStep;         /* Size of aligned image row in bytes.    */int  BorderMode[4];     /* Ignored by OpenCV.                     */int  BorderConst[4];    /* Ditto.                                 */char *imageDataOrigin;  /* Pointer to very origin of image data(not necessarily aligned) -needed for correct deallocation */
}
IplImage;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
depth变量:像素的深度。深度值有:

#define IPL_DEPTH_1U     1
#define IPL_DEPTH_8U     8
#define IPL_DEPTH_16U   16
#define IPL_DEPTH_32F   32#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)
#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)

通俗一点讲就是像素的取值大小,例如:IPL_DEPTH_8U 即代表有8位数据,最大值256,即一个像素的颜色等级分为256种。从0到256不断加深。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

nChannels变量:图像通道(通道的概念之前有介绍)。
彩色图像的排列方式:
彩色图像一般是由3通道表示。3通道表示一个像素点有三个值,分别对应R,G,B.RGB决定该像素点的颜色。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一下其他的重要参数:
imageData 包含一个指向第一行图像数据的指针。
widthStep是指一个排列图像行的大小,以字节为单位。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

访问图像数据

实例:分别打印一个彩色图像和R,G,B三个单通道的图像

int main()
{IplImage* img;img = cvLoadImage("F:\\Opencv\\素材\\楪析.jpg");IplImage* b_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);IplImage* g_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);IplImage* r_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);int x, y;for (y = 0; y < img->height; y++){unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep);unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);for (x = 0; x < img->width; x++){brow[x] = prow[3 * x + 0];grow[x] = prow[3 * x + 1];rrow[x] = prow[3 * x + 2];}}cvNamedWindow("1");cvShowImage("1", img);cvNamedWindow("b");cvShowImage("b", b_img);cvNamedWindow("r");cvShowImage("r", r_img);cvNamedWindow("g");cvShowImage("g", g_img);cvWaitKey(0);return 0;}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

对ROI和widthStep的补充

ROI全称:region of interest,即:感兴趣的区域。使用ROI可以对图像的部分区域进行操作而不是对图像额整个区域进行运算,可以提高计算机视觉代码的执行速度。
例:用imageROI来增加某范围的像素。

int main()
{IplImage* img;img = cvLoadImage("F:\\Opencv\\素材\\楪析.jpg");CvRect rect;rect.x = 350;rect.y = 102;rect.width = 166;rect.height = 141;cvSetImageROI(img, rect);cvAddS(img, cvScalar(150), img);cvResetImageROI(img);cvNamedWindow("1");cvShowImage("1", img);cvWaitKey(0);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

介绍几个主要函数:
cvSetImageROI()和cvResetImageROI()这两个函数用来设置和取消ROI,
void cvSetImageROI(IplImage* image,CvRect rect);
需要传递一个图像指针和矩阵,这个矩阵

typedef struct CvRect
{int x;int y;int width;int height;
}
CvRect;

x,y是ROI图像起始点的坐标,width和height是ROI图像的宽度和高度。
图像指针是指我们选取ROI区域的母图像。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我们可以使用widthStep达到同样的效果,
首先我们要创建一个CvRect结构体,设置图像起点和大小。
然后创建一个图像头,让它的width和height和之前创建CvRect结构体的width和height相同,并且让它的通道和像素深度与母图像的相同。
在使图像头的origin(起点)和widthStep(步长)和母图像相同,
可以理解为创建一个大小与母图像相等CvRect结构体指定的图像区域有颜色,其他地方是透明的图像覆盖在母图像上面。例程如下:

int main()
{IplImage* interest_img = cvLoadImage("F:\\Opencv\\素材\\楪析.jpg");CvRect interest_rect = cvRect(350, 102, 166, 141);IplImage* sub_img = cvCreateImageHeader(cvSize(interest_rect.width, interest_rect.height),interest_img->depth,interest_img->nChannels);sub_img->origin = interest_img->origin;sub_img->widthStep = interest_img->widthStep;sub_img->imageData = interest_img->imageData + interest_img->widthStep*interest_rect.y +interest_img->nChannels*interest_rect.x;cvAddS(sub_img, cvScalar(150), sub_img);cvNamedWindow("interest_img");cvNamedWindow("sub_img");cvShowImage("interest_img", interest_img);cvShowImage("sub_img", sub_img);cvResetImageROI(sub_img);cvWaitKey(0);cvDestroyWindow("interest_img");cvDestroyWindow("sub_img");interest_img = NULL;sub_img = NULL;return 0;
}

看起来设置和重置ROI更方便一些,为什么还要使用widthStep?原因在于有些时候在处理的过程中,想在操作过程中设置和保持一幅图像的多个子区域处于活动状态,但是ROI只能串行处理并且必须不断地设置和重置。

opencv学习笔记(八)-IplImage数据结构相关推荐

  1. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  2. opencv学习笔记八--答题卡识别

    opencv学习笔记八--答题卡识别 导入工具包 定义函数 扫描 自适应阈值处理 检测每一个选项的轮廓 对轮廓进行排序以获取序号 打印结果 参考 导入工具包 #导入工具包 import numpy a ...

  3. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  4. OpenCV学习笔记三-Mat数据结构

    主要记录Mat数据结构的一些操作 P3 Mat 数据结构的一些操作 #include<opencv2/opencv.hpp> #include<iostream>using n ...

  5. OPenCV学习笔记八-图像的滤波

    主要记录三种滤波函数的使用 VS2017 + Opencv3.2.0#include <opencv2/opencv.hpp> #include <iostream>using ...

  6. OpenCV学习笔记(八)--颜色空间及转换

    颜色空间 要用三种或更多的特征来指定一种颜色,有许多的方法被称为颜色空间或者颜色模型. 如何选取其中一种方法来表示一副图像要依赖于执行的运算. 不同的颜色空间的转换,Opencv提供方法 void c ...

  7. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  8. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  9. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  10. OpenCV学习笔记(六)(七)(八)(九)(十)

    OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...

最新文章

  1. 不定高度的弹框 垂直水平居中
  2. pycharm报错(Non-zero exit code (2))与手动安装报错
  3. cass插件_第009期分享:Cass插件合集
  4. Petya and Exam 模拟
  5. SQL2005开发版下载地址
  6. android计算器(按钮版)
  7. 突出的就是一个「性价比」— 小新 Air 14 2020 评测
  8. mysql 主键 外键
  9. 一块硬盘的爱情故事,好揪心
  10. 如何设置BIOS实现远程开机
  11. hadoop日常应用的一点小分享(新人鄙见)
  12. php sphinx应用场景,Sphinx+Scws 搭建千万级准实时搜索应用场景详解
  13. 夏天泡脚的好处和注意事项
  14. 海航重组当当,航机飘上书香
  15. 【QQ音乐Html + CSS静态笔记】
  16. (JavaSE 学习记录) 多线程之两种常用实现方式
  17. ICMP是个啥?一分钟介绍ICMP协议
  18. Web应用与Web框架
  19. word2019文档中输入空格变成省略号圆点正方形空白框去除方法
  20. 【地表最强】亚马逊Amazon高性能爬虫

热门文章

  1. windows server 2003 asp环境搭建
  2. 禧龙字王 v1.0 beta 4 工作站版 是什么
  3. 盛世昊通谈跨界造车风潮,不同车企到底打什么主意
  4. 第十二章 采购管理 采购合同类型以及其区别 合同类型与风险分担 自制与外购分析 招标文件 工作说明书(SOW) 工作大纲 (TOR) 投标人会议 采购谈判 检查 审计 索赔管理 采购合同争议解决方式对
  5. 广西建筑行业人才市场暴涨
  6. ET vs Ad hoc
  7. 汉澳sinox2013支持的PCI/USB无线网卡,购买必看
  8. GPIO模拟MDC/MDIO协议
  9. STM32HAL库使用RX8025
  10. 拼音加加在双拼状态下在输入数字后的标点不正常的解决方式