opencv学习_5 (IplImage的结构)
IplImage结构体为:
typedef struct _IplImage
{
int nSize; /* IplImage大小 */
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel; /* 被OpenCV忽略 */
int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
cvCreateImage只能创建交叉存取图像 */
int origin; /* 0 - 顶—左结构,
1 - 底—左结构 (Windows bitmaps 风格) */
int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */
int BorderConst[4]; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
}
IplImage;
1:重要的参数有nChannels depth origin width height widthStep<和矩阵的step相同> imageData—指针<注意图像的数据类型为uchar,imageData为char类型,没有CvMat那么复杂了>
2:彩色图像的数据排列方式
彩色图像有三个通道(B,G,R),这三个通道的值,在Opencv中的排列顺序是B0G0R0B1G1R1…BnGnRn,采用这种交叉排列的方式进行存储。
3:访问IplImage的数据 ---- 指针访问<注意图像的数据类型为uchar >
代码:
#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
int main()
{
IplImage *image = cvLoadImage("F:\\11.jpg",1);
cvNamedWindow("show",0);
for(int y = 0; y < image->height; y++)
{
uchar *p_image = (uchar*)(image->imageData + y * image->widthStep);
for(int x = 0; x < image->width; x++)
{
*(p_image + x*3) = 0;
}
}
cvShowImage("show", image);
cvWaitKey(0);
return 0;
}
4:将三通道分解为三个单通道 彩色必须由三种颜色构成 单通道只能说明是该取值,不能说明其它色彩,彩色必须要有三种通道构成 用到的函数为cvCreateImage
code:
#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
int main()
{
IplImage *image = cvLoadImage("F:\\11.jpg",1);
IplImage *b_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
IplImage *g_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
IplImage *r_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvNamedWindow("show",0);
cvNamedWindow("b",0);
cvNamedWindow("g",0);
cvNamedWindow("r",0);
for(int y = 0; y < image->height; y++)
{
uchar *p_image = (uchar*)(image->imageData + y * image->widthStep);
uchar *b_image = (uchar*)(b_img->imageData + y * b_img->widthStep);
uchar *g_image = (uchar*)(g_img->imageData + y * g_img->widthStep);
uchar *r_image = (uchar*)(r_img->imageData + y * r_img->widthStep);
for(int x = 0; x < image->width; x++)
{
b_image[x] = *(p_image + x*3);
g_image[x] = *(p_image + x*3 + 1);
r_image[x] = *(p_image + x*3 + 2);
}
}
cvShowImage("show", image);
cvShowImage("b", b_img);
cvShowImage("g", g_img);
cvShowImage("r", r_img);
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&b_img);
cvReleaseImage(&g_img);
cvReleaseImage(&r_img);
cvDestroyWindow("show");
cvDestroyWindow("b");
cvDestroyWindow("g");
cvDestroyWindow("r");
return 0;
}
5:ROI和COI的理解
ROI是Region of Interest 的缩写。表示的是在一副大图像的感兴趣区域。”感兴趣区域”,指的是再一副大图像中,我们需要做处理的一部分
COI是Channels Of Interest, 是指感兴趣的通道,彩色图像有BGR三个通道。所以,可以选择其中一个作为感兴趣通道
用到的函数为cvSetImageROI cvResetImageROI cvCopy
code(图像的一部分替换另一幅图像的一部分):
#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std; int main()
{
IplImage *tongtong = cvLoadImage("F:\\tongtong.jpg",1);
IplImage *jiale = cvLoadImage("F:\\jiale.jpg",1);
CvRect rect,rect1;
rect.x = 1200;
rect.y = 300;
rect.width = 340;
rect.height = 400;
rect1.x = 90;
rect1.y= 65;
rect1.width = 120;
rect1.height = 150;
cvSetImageROI(jiale,rect);
cvSetImageROI(tongtong,rect1);
cvResize(jiale,tongtong);
//cvCopy(jiale,tongtong);
cvResetImageROI(tongtong);
cvNamedWindow("tongtong");
cvNamedWindow("jiale");
cvShowImage("tongtong",tongtong);
cvShowImage("jiale",jiale);
cvWaitKey(0);
return 0;
}
作者:小村长 出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)
opencv学习_5 (IplImage的结构)的更多相关文章
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- OpenCV 学习笔记 01 安装OpenCV及相关依赖库
本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...
- OpenCV学习笔记之课后习题练习3-5
OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...
随机推荐
- 《Android源码设计模式》--享元模式
No1: 享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享.避免创建过多对象的效果,这样一来就可以提升性能.避免内存 ...
- SpringBoot和微服务
SpringCloud SpringBoot 概念 应用 微服务CAP Consistency(数据强一致性),Availability(服务可用性),Partition-tolerance(分区容错 ...
- Tensorflow学习:(三)神经网络优化
一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...
- Bzoj2164 采矿(线段树+树链剖分)
题面 Bzoj 题解 对于每个节点,我们可以用树链剖分和线段树维护以下信息: 单独在某个点分配\(i\)个人的最大收益(可以\(O(m)\)计算) 分配\(i\)的最大收益(可以\(O(m^2)\)计 ...
- BoneBlack am335x can0 通讯配置与测试
准备工具: 1.内核3.14.65,u-boot.文件系统 2.boneblack开发板 3.串口线.电源线,测试线,测试夹 一.配置内核支持CAN通讯 [*] Networking support ...
- MacBook Apache服务
想着如何在Mac OS下部署静态网页(纯粹的html,css,js),用惯了windows下的iis,可惜Mac OS下也许只能通过Tomcat或者Apache之类的作为部署容器.听说Mac OS下自 ...
- 安装部署VMware vSphere 5.5文档 (6-4) 安装配置DB数据库
部署VMware vSphere 5.5 实施文档 ########################################################################## ...
- 我的vim配置脚本
自己的VIM 配置脚本,拥有自主独立知识产权(参考了一点别人的),只使用了一个插件ctags ,主要实现了一下功能: 自动补全括号,双引号,单引号,包括{},(),"" , ''只 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
- hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语
题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...