opencv学习笔记[10]:IplImage数据结构
来源:互联网 发布:知网数据库一年多少钱 编辑:程序博客网 时间:2024/05/12 08:02
1.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->widthStep
in 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;
掌握IplImage的几个重要的数据结构:
- Width
- Height
- Depth: usually use IPL_DEPTH_*U/S/F
- nChannals :can be valued 1,2,3,4
- origin: only can be valued IPL_ORIGIN_TL or IPL_ORIGIN_BL
- dataOrder: can be valued by IPL_DATA_ORDER_PIXEL or IPL_DATA_ORDER_PLANE
- widthStep :临行同列之间的字节数
2.访问图像数据
利用指针遍历(矩阵遍历)的方法,如下程序是最高效的方法:
#include <cv.h>
#include <highgui.h>
//仅最大化hsv图像的 s 和 v 部分
//因为这是一个三通道图像 所以c通道在x行的位置是3*x+c
//与CvMat不同的是:IplImage的imageData结构
int saturate_sv(IplImage * img)
{
if(img->nChannels!=3)
return (0);
for(int y=0;y<img->height;y++)
{
uchar * ptr = (uchar *)img->imageData + img->widthStep * y;
for(int x=0;x<img->width;x++)
{
ptr[3*x+1]=255;
ptr[3*x+2]=255;
}
}
return 1;
}
int main()
{
cvNamedWindow("test-1");
cvNamedWindow("test-2");
IplImage * image=cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\airplane.png");
cvShowImage("test-1",image);
int result = saturate_sv(image);
cvShowImage("test-2",image);
cvWaitKey();
cvReleaseImage(&image);
cvDestroyWindow("test-1");
cvDestroyWindow("test-2");
printf("%d",result);
}
3.ROI
下面的例子说明用imageROI来增加某范围的像素
int main()
{
IplImage * src;
if((src=cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\airplane.png",1)) != 0)
{
int x = 200;
int y = 200;
int width = 200;;
int height = 200;
int add = 150;
cvSetImageROI(src,cvRect(x,y,width,height));
cvAddS(src,cvScalar(add),src);
cvResetImageROI(src);
cvNamedWindow("roi-add");
cvShowImage("roi-add",src);
cvWaitKey();
}
return 0;
}
其他方法:
#include <cv.h>
#include <highgui.h>
int main()
{
IplImage * interest_img = cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\airplane.png");
CvRect interest_rect = cvRect(100,100,100,100);
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_rect.x * interest_img->nChannels + interest_rect.y* interest_img->widthStep;
cvAddS(sub_img,cvScalar(1),sub_img);
cvNamedWindow("roi-add");
cvShowImage("roi-add",sub_img);
cvWaitKey();
cvReleaseImageHeader(&sub_img);
}
- opencv学习笔记[10]:IplImage数据结构
- OpenCV学习笔记 -- IplImage数据结构
- OpenCV学习笔记(二)—IplImage数据结构
- 《学习opencv》笔记——IplImage数据结构
- opencv学习笔记(八)-IplImage数据结构
- OpenCV IplImage数据结构
- [zz]OpenCV 学习笔记之IplImage 结构
- 【OpenCV】基本数据类型、IplImage数据结构
- OpenCv基础学习笔记之一[types_c.h][IplImage]
- opencv学习笔记之三 IplImage结构体
- OpenCV学习(八)之OpenCV中IplImage和CvMat图像数据结构
- 【学习OpenCV】Mat、CvMat、IplImage
- OpenCV学习笔记----------OpenCV数据结构Mat详解
- opencv学习笔记(1)----opencv常用数据结构
- OpenCV笔记(七)IplImage结构体初解
- openCv笔记--IPLImage和Mat的resize
- OpenCV 学习笔记 [1] 基本数据结构, CvMat
- openCV学习笔记(1)--IplIamge数据结构
- opencv简单平滑变换:cvSmooth (5)
- opencv复杂变换cvPyrDown [6]
- opencv关于cvcanny函数 [7]
- opencv写入AVI文件[8]
- opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
- opencv学习笔记[10]:IplImage数据结构
- Struts2入门到精通十——————国际化
- 第十五讲 :libgdx游戏引擎教程(十五)在Libgdx中仿微信帮助滑动效果(附源码)
- 初学者需要掌握的数据库设计词汇对照表(一)
- C#中窗口之间传递数据几种方法
- The Maven Integration requires that Eclipes be running in a JDK because a number o eclipes加载maven出错
- NFS挂载目录共享(整理版)
- 苹果信息推送服务(Apple Push Notification Service)使用总结
- 关闭虚拟机操作系统的 “嘀嘀” 报警声问题 && vi命令编辑文件没有颜色区分问题