IplImage结构体数据解析

IplImage

由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。

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 和IPL_DEPTH_64F */
  char colorModel[4]; /* 被OpenCV忽略 */
  char channelSeq[4]; /* 同上 */
  int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
  /*只有cvCreateImage可以创建交叉存取图像 */
  int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
  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;

imageData是图片存储的核心数据

我们可以用这种方法访问图片的数据

    uchar Blue[240][320];
    uchar Green[240][320];
    uchar Red[240][320];

    for(int i=0;i<Image1->height;i++)
    {
        for(int j=0;j<Image1->widthStep;j=j+3)
        {
            Blue[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j];
            Green[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+1];
            Red[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+2];

            Image1->imageData[i*Image1->widthStep+j]=0;//B
            Image1->imageData[i*Image1->widthStep+j+1]=0;//G
            Image1->imageData[i*Image1->widthStep+j+2]=255;//R
        }
    }
    cvNamedWindow("Red",1);
    cvShowImage("Red",Image1);

注意:imageData中的RGB三元色排列与平常不同,其排列顺序为B,G,R

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 06:52:31

IplImage结构体数据解析的相关文章

Socket传输结构体数据注意事项

[1 背景] 在Socket通信中,要传输结构化的数据或者要进行协议数据传输的时候,发送端必须要构造结构体进行数据传输. 接收端也必须通过同样的结构体进行解析. 但Socket传输结构体数据时候,稍有不慎就会出现:1)解析数据出错:2)接收数据不完整:3)解析为乱码等的Bug. [2 举例] 如下是接收端解析数据为乱码甚至崩溃的一类常见错误. 结构体也就是一段连续的内存. 但是类似如下的结构体: typedef struct _PER_SPIDER_INFO { UINT nTimeDelay;

剔除list中相同的结构体数据

剔除list中相同的结构体数据,有三个思路: 1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. // #include <list> #include <set> #include <iostream> #include <algorithm> #include <vector> #include <tchar.h> using

vector存放结构体数据的2种方法

如果要在Vector容器中存放结构体类型的变量,经常见到两种存放方式. 方式一:放入这个结构体类型变量的副本. 方式二:放入指向这个结构体类型变量的指针. 假设结构体类型变量是这样的, typedef struct student{ char school_name[100]; char gender; int age; bool is_absent; } StudentInfo; 那么,方式一和方式二的实现分别如下所示: /*[方式一] 结构体放栈中,vector中放副本-----------

go语音之进阶篇json解析到结构体

1.json解析到结构体 示例: package main import ( "encoding/json" "fmt" ) type IT struct { Company string `json:"company"` Subjects []string `json:"subjects"` //二次编码 IsOk bool `json:"isok"` Price float64 `json:"

opencv——IplImage结构

一.作业要求: 采用MATLAB或opencv+C编程实现.每一题写明题目,给出试验程序代码,实验结果图片命名区分并作出效果比对,最后实验总结说明每一题蕴含的图像处理方法的效果以及应用场合等. 采用MATLAB编程比采用opencv+C编程得分低:如果MATLAB或opencv+C只在读入图片时采用自带函数(算法核心部分自己独立编程)的,得分高. 二.实验题目: 1. 把一幅灰度图像的垂直分辨率和水平分辨率都变为原来的一半,生成一副新的图像. IplImage 由于OpenCV主要针对的是计算机

Linux C语言下TCP传结构体

1.废话不多说,本文介绍的是Linux下C语言实现TCP传递结构体数据: a.TCP Server一直在等待接收数据 b.TCP Client发送结构体数据 c.TCP Server接收数据并解析出来 2.结构体介绍: a.实际上要发送的结构体是: struct TCP_STRUCT_DATA{int m_cmd;//命令 可以用宏定义或者枚举区分不同的命令int m_data_len;//要发的数据的长度char *data;//要发的数据}DATA_SEND, *PDATA_SEND; b.

结构体/联合体 所占用内存

1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 typedef struct Parameter{ 6 int a; 7 long b; 8 double c; 9 int d; 10 }Parameter; 11 12 typedef union Para{ 13 unsigned a; 14 double b; 15 long c; 16 int d; 17 }Para; 18

结构体对齐详解【转】

 1 -- 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度.比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个

C++ 结构体多元素sort排序调用时的写法

//总结一下,结构体数据排序的快速写法 //以后在遇到需要写的时候,不要迟疑快速写完 struct node { int u, v, w; }a[10000]; //假设该结构体有3个元素 //现在仅实现结构体数组按照w的值从小到大的排序 //1.基于C++的重载写法,写在结构体的定义内 如下: struct node { int u, v, w; bool operator <(const node &x)const { return w<x.w; //升序排列 } }; //现在提