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,
  8. IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
  9. char colorModel[4]; /* 被OpenCV忽略 */
  10. char channelSeq[4]; /* 同上 */
  11. int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
  12. cvCreateImage只能创建交叉存取图像 */
  13. int origin; /* 0 - 顶—左结构,
  14. 1 - 底—左结构 (Windows bitmaps 风格) */
  15. int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
  16. int width; /* 图像宽像素数 */
  17. int height; /* 图像高像素数*/
  18. struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
  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. }
  29. IplImage;

1:重要的参数有nChannels  depth  origin width height  widthStep<和矩阵的step相同>  imageData—指针<注意图像的数据类型为uchar,imageData为char类型,没有CvMat那么复杂了>

2:彩色图像的数据排列方式

彩色图像有三个通道(B,G,R),这三个通道的值,在Opencv中的排列顺序是B0G0R0B1G1R1…BnGnRn,采用这种交叉排列的方式进行存储。

3:访问IplImage的数据 ---- 指针访问<注意图像的数据类型为uchar >

代码:

  1. #include <iostream>
  2. #include "cv.h"
  3. #include "cxcore.h"
  4. #include "highgui.h"
  5. using namespace std;
  6. int main()
  7. {
  8. IplImage *image = cvLoadImage("F:\\11.jpg",1);
  9. cvNamedWindow("show",0);
  10. for(int y = 0; y < image->height; y++)
  11. {
  12. uchar *p_image = (uchar*)(image->imageData + y * image->widthStep);
  13. for(int x = 0; x < image->width; x++)
  14. {
  15. *(p_image + x*3) = 0;
  16. }
  17. }
  18. cvShowImage("show", image);
  19. cvWaitKey(0);
  20. return 0;
  21. }

4:将三通道分解为三个单通道     彩色必须由三种颜色构成 单通道只能说明是该取值,不能说明其它色彩,彩色必须要有三种通道构成   用到的函数为cvCreateImage

code:

  1. #include <iostream>
  2. #include "cv.h"
  3. #include "cxcore.h"
  4. #include "highgui.h"
  5. using namespace std;
  6. int main()
  7. {
  8. IplImage *image = cvLoadImage("F:\\11.jpg",1);
  9. IplImage *b_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  10. IplImage *g_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  11. IplImage *r_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  12. cvNamedWindow("show",0);
  13. cvNamedWindow("b",0);
  14. cvNamedWindow("g",0);
  15. cvNamedWindow("r",0);
  16. for(int y = 0; y < image->height; y++)
  17. {
  18. uchar *p_image = (uchar*)(image->imageData + y * image->widthStep);
  19. uchar *b_image = (uchar*)(b_img->imageData + y * b_img->widthStep);
  20. uchar *g_image = (uchar*)(g_img->imageData + y * g_img->widthStep);
  21. uchar *r_image = (uchar*)(r_img->imageData + y * r_img->widthStep);
  22. for(int x = 0; x < image->width; x++)
  23. {
  24. b_image[x] = *(p_image + x*3);
  25. g_image[x] = *(p_image + x*3 + 1);
  26. r_image[x] = *(p_image + x*3 + 2);
  27. }
  28. }
  29. cvShowImage("show", image);
  30. cvShowImage("b", b_img);
  31. cvShowImage("g", g_img);
  32. cvShowImage("r", r_img);
  33. cvWaitKey(0);
  34. cvReleaseImage(&image);
  35. cvReleaseImage(&b_img);
  36. cvReleaseImage(&g_img);
  37. cvReleaseImage(&r_img);
  38. cvDestroyWindow("show");
  39. cvDestroyWindow("b");
  40. cvDestroyWindow("g");
  41. cvDestroyWindow("r");
  42. return 0;
  43. }

5:ROI和COI的理解

ROI是Region of Interest 的缩写。表示的是在一副大图像的感兴趣区域。”感兴趣区域”,指的是再一副大图像中,我们需要做处理的一部分

COI是Channels Of Interest, 是指感兴趣的通道,彩色图像有BGR三个通道。所以,可以选择其中一个作为感兴趣通道

用到的函数为cvSetImageROI  cvResetImageROI cvCopy

code(图像的一部分替换另一幅图像的一部分):

  1. #include <iostream>
  2. #include "cv.h"
  3. #include "cxcore.h"
  4. #include "highgui.h"
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. IplImage *tongtong = cvLoadImage("F:\\tongtong.jpg",1);
  10. IplImage *jiale = cvLoadImage("F:\\jiale.jpg",1);
  11. CvRect rect,rect1;
  12. rect.x = 1200;
  13. rect.y = 300;
  14. rect.width = 340;
  15. rect.height = 400;
  16. rect1.x = 90;
  17. rect1.y= 65;
  18. rect1.width = 120;
  19. rect1.height = 150;
  20. cvSetImageROI(jiale,rect);
  21. cvSetImageROI(tongtong,rect1);
  22. cvResize(jiale,tongtong);
  23. //cvCopy(jiale,tongtong);
  24. cvResetImageROI(tongtong);
  25. cvNamedWindow("tongtong");
  26. cvNamedWindow("jiale");
  27. cvShowImage("tongtong",tongtong);
  28. cvShowImage("jiale",jiale);
  29. cvWaitKey(0);
  30. return 0;
  31. }

作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)

opencv学习_5 (IplImage的结构)的更多相关文章

  1. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  2. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  3. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  4. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  5. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  6. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  7. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  8. OpenCV 学习笔记 01 安装OpenCV及相关依赖库

    本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...

  9. OpenCV学习笔记之课后习题练习3-5

    OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...

随机推荐

  1. php 生成二维码(qrcode)

    可以用composer安装 https://packagist.org/packages/endroid/qrcode

  2. 七牛云整合Ueditor的ThinkPHP版本

    首先去七牛云官网下载phpSDK工具放在Think/library/Vendor下. ueditor后台调用方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  3. 一步一步写数据结构(BST-二叉排序树)

    二叉排序树的重要性不用多说,下面用c++实现二叉排序树的建立,插入,查找,修改,和删除.难点在于删除,其他几个相对比较简单. 以下是代码: #include<iostream> using ...

  4. Extjs设置或获取cookie

    设置cookie var myCookie = Ext.util.Cookie.set(‘YourCookieName’,'YourValue’); 读取cookie Ext.util.Cookie. ...

  5. 深入理解mysql的自连接和join关联

    一.mysql自连接 mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名.我们举例说明,下面是商品采购表,我们需要找到采购价格比惠惠高的所有信息. 一般情况我们看到这张表 ...

  6. session过期情况下ajax请求不会触发重新登录的问题

    在拦截器中添加以下逻辑 String requestType = request.getHeader("X-Requested-With"); if (!StringUtils.i ...

  7. 「NOI2014」购票

    「NOI2014」购票 解题思路 先列出 \(dp\) 式子并稍微转化一下 \[ dp[u] =\min(dp[v]+(dis[u]-dis[v]) \times p[u] + q[u])) \ \ ...

  8. 通过Nuget添加Mvvmlight框架发生错误

    IDE:Visual Studio 2013 场景:通过Nuget添加Mvvmlight框架 具体错误: 解决办法:删除Nuget,然后添加新版本的Nuget Package Manager 具体操作 ...

  9. 快速定位问题 Request无法获取参数

    比如说最近开发甲修改了iframe标签的src,开发乙在设置src的时候传入了2个参数,通过iframe标签链接到这个页面时,开发乙调试时发现没有拿到任何参数值.然后开发乙百度了一下,发现iframe ...

  10. ASP.NET 构建高性能网站 第1篇

    网站优化需要考虑的方面 在用ASP.NET开发网站的时候,性能是永远需要考虑和关注的问题,性能不仅仅只是程序代码执行时候的速度,而是涉及到方方面面的东西. 就拿ASP.NET的一个请求来讲,从浏览器向 ...