﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-lixiaona0417</title><link>http://www.cppblog.com/lixiaona0417/</link><description>春去春又来</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:09:18 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:09:18 GMT</pubDate><ttl>60</ttl><item><title>C/C++中几个数据类型转换的介绍</title><link>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141161.html</link><dc:creator>微风</dc:creator><author>微风</author><pubDate>Sat, 05 Mar 2011 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141161.html</guid><wfw:comment>http://www.cppblog.com/lixiaona0417/comments/141161.html</wfw:comment><comments>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lixiaona0417/comments/commentRss/141161.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lixiaona0417/services/trackbacks/141161.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(50,62,50); LINE-HEIGHT: 21px; FONT-FAMILY: simsun; TEXT-ALIGN: left">
<h1 style="BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none; BORDER-RIGHT-WIDTH: 0px"><font style="FONT-SIZE: 20px; WORD-BREAK: normal; LINE-HEIGHT: 30px; WORD-WRAP: normal">ltoa</font></h1>
<div>　　ltoa函数把长整形数转换为字符串的函数<br>　　<strong>原型</strong>：char *ltoa(long value,char *string,int radix)<br>　　<strong>功能</strong>：把value的值转换为以NULL结束的字符串，并把结果存在string中。radix是转换的基数值，在2 到36之间。分配给string的空间必须可容纳返回的所有字节（最多33字节）。<br>　　<strong>返回值</strong>：指向string的指针<br>　　<strong>头文件</strong>：stdlib.h<br>　　ltoa()的声明是：<br>　　char *ltoa(long value,char *string,int radix);<br>　　value ----------------- 要转换的数值<br>　　string ----------------- 转换后指向字符串的指针<br>　　radix ----------------- 进制<br>　　例如：ltoa(num,str,10); // 将num以10进制方式转换为串str<br>　　如当num=159时，则str='159'<br><br>&nbsp;&nbsp;&nbsp;<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(50,62,50); LINE-HEIGHT: 21px; FONT-FAMILY: simsun; TEXT-ALIGN: left">
<h1 style="BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none; BORDER-RIGHT-WIDTH: 0px"><font style="FONT-SIZE: 22px; WORD-BREAK: normal; LINE-HEIGHT: 33px; WORD-WRAP: normal">atoi</font></h1>
<div>　　C语言库函数名: atoi　　功 能: 把字符串转换成整型数.名字来源:array to integer<span class=Apple-converted-space>&nbsp;</span>的缩写。函数说明: atoi()会扫描参数nptr字符串，如果第一个字符不是数字也不是正负号返回零，否则开始做类型转换，之后检测到非数字或结束符 \0 时停止转换，返回整型数，原型: int atoi(const char *nptr);需要用到的头文件: #include &lt;stdlib.h&gt;</div>
</span></span><br></div>
<div></span></span>&nbsp;</div>
<img src ="http://www.cppblog.com/lixiaona0417/aggbug/141161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lixiaona0417/" target="_blank">微风</a> 2011-03-05 14:15 <a href="http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenCV的IplImage数据结构的各成员变量的含义</title><link>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141155.html</link><dc:creator>微风</dc:creator><author>微风</author><pubDate>Sat, 05 Mar 2011 03:05:00 GMT</pubDate><guid>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141155.html</guid><wfw:comment>http://www.cppblog.com/lixiaona0417/comments/141155.html</wfw:comment><comments>http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lixiaona0417/comments/commentRss/141155.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lixiaona0417/services/trackbacks/141155.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">IplImage是openCV库中很重要的一个结构体，库中的图像都是保存为这个结构体后再进行操作的。下面先转载一篇将这个结构体的文章<span class=Apple-style-span style="FONT-FAMILY: 'Courier New', Courier, 宋体; WHITE-SPACE: normal; BORDER-COLLAPSE: separate"><a style="COLOR: rgb(204,76,127); TEXT-DECORATION: none" href="http://www.sciencenet.cn/m/user_content.aspx?id=251363">http://www.sciencenet.cn/m/user_content.aspx?id=251363</a></span></span></span></div>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); PADDING-TOP: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(47,86,2); LINE-HEIGHT: 21px; FONT-FAMILY: Arial, Helvetica, sans-serif"></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">IplImage 结构解读：</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">typedef struct _IplImage<br style="WORD-BREAK: break-all">{<br style="WORD-BREAK: break-all">int nSize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="WORD-BREAK: break-all">/* IplImage大小 */<br style="WORD-BREAK: break-all">int ID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="WORD-BREAK: break-all">/* 版本 (=0)*/<br style="WORD-BREAK: break-all">int nChannels;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="WORD-BREAK: break-all">/* 大多数OPENCV函数支持1,2,3 或 4 个通道 */<br style="WORD-BREAK: break-all">int alphaChannel;&nbsp;<br style="WORD-BREAK: break-all">/* 被OpenCV忽略 */<br style="WORD-BREAK: break-all">int depth;&nbsp;<br style="WORD-BREAK: break-all">/* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,<br style="WORD-BREAK: break-all">IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */<br style="WORD-BREAK: break-all">char colorModel[4];&nbsp;<br style="WORD-BREAK: break-all">/* 被OpenCV忽略 */<br style="WORD-BREAK: break-all">char channelSeq[4];&nbsp;<br style="WORD-BREAK: break-all">/* 同上 */<br style="WORD-BREAK: break-all">int dataOrder;&nbsp;<br style="WORD-BREAK: break-all">/* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.<br style="WORD-BREAK: break-all">cvCreateImage只能创建交叉存取图像 */<br style="WORD-BREAK: break-all">int origin;&nbsp;<br style="WORD-BREAK: break-all">/* 0 - 顶—左结构,1 - 底—左结构 (Windows bitmaps 风格) */<br style="WORD-BREAK: break-all">int align;&nbsp;<br style="WORD-BREAK: break-all">/* 图像行排列 (4 or 8). OpenCV 忽略它，使用 widthStep 代替 */<br style="WORD-BREAK: break-all">int width;&nbsp;<br style="WORD-BREAK: break-all">/* 图像宽像素数 */<br style="WORD-BREAK: break-all">int height;<br style="WORD-BREAK: break-all">/* 图像高像素数*/<br style="WORD-BREAK: break-all">struct _IplROI *roi;<br style="WORD-BREAK: break-all">/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */<br style="WORD-BREAK: break-all">struct _IplImage *maskROI;&nbsp;<br style="WORD-BREAK: break-all">/* 在 OpenCV中必须置NULL */<br style="WORD-BREAK: break-all">void *imageId;&nbsp;<br style="WORD-BREAK: break-all">/* 同上*/<br style="WORD-BREAK: break-all">struct _IplTileInfo *tileInfo;&nbsp;<br style="WORD-BREAK: break-all">/*同上*/<br style="WORD-BREAK: break-all">int imageSize;&nbsp;<br style="WORD-BREAK: break-all">/* 图像数据大小(在交叉存取格式下imageSize=image-&gt;height*image-&gt;widthStep），单位字节*/<br style="WORD-BREAK: break-all">char *imageData;&nbsp;<br style="WORD-BREAK: break-all">/* 指向排列的图像数据 */<br style="WORD-BREAK: break-all">int widthStep;&nbsp;<br style="WORD-BREAK: break-all">/* 排列的图像行大小，以字节为单位 */<br style="WORD-BREAK: break-all">int BorderMode[4];&nbsp;<br style="WORD-BREAK: break-all">/* 边际结束模式, 被OpenCV忽略 */<br style="WORD-BREAK: break-all">int BorderConst[4];&nbsp;<br style="WORD-BREAK: break-all">/* 同上 */<br style="WORD-BREAK: break-all">char *imageDataOrigin;&nbsp;<br style="WORD-BREAK: break-all">/* 指针指向一个不同的图像数据结构（不是必须排列的），是为了纠正图像内存分配准备的 */<br style="WORD-BREAK: break-all">}<br style="WORD-BREAK: break-all">IplImage;</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><br style="WORD-BREAK: break-all"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">重要结构元素说明：</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">depth和nChannels</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">depth代表颜色深度，使用的是以下定义的宏,nChannels是通道数，为1,2,3或4。<br style="WORD-BREAK: break-all">depth的宏定义：<br style="WORD-BREAK: break-all">IPL_DEPTH_8U,无符号8bit整数(8u)<br style="WORD-BREAK: break-all">IPL_DEPTH_8S,有符号8bit整数(8s)<br style="WORD-BREAK: break-all">IPL_DEPTH_16S,有符号16bit整数(16s)<br style="WORD-BREAK: break-all">IPL_DEPTH_32S,有符号32bit整数(32s)<br style="WORD-BREAK: break-all">IPL_DEPTH_32F,32bit浮点数，单精度(32f)<br style="WORD-BREAK: break-all"></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); PADDING-TOP: 0px"></p>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse"><span class=Apple-style-span style="FONT-SIZE: small; COLOR: rgb(47,86,2); FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate">IPL_DEPTH_64F,64bit浮点数，双精度(64f)</span><span class=Apple-tab-span style="WHITE-SPACE: pre"> </span></span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">（<span class=Apple-style-span style="COLOR: rgb(255,1,2)">注：</span>这里的颜色深度是指单个通道的数据保存为的变量类型，例如RGB24格式的数据，通道数为3，颜色深度为<span class=Apple-style-span style="FONT-SIZE: small; COLOR: rgb(47,86,2); FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate">IPL_DEPTH_8U<span class=Apple-style-span style="FONT-SIZE: 12px; COLOR: rgb(0,0,0); FONT-FAMILY: Arial; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">）</span></span></span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(47,86,2); FONT-FAMILY: Arial, Helvetica, sans-serif; WHITE-SPACE: normal; BORDER-COLLAPSE: separate">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">origin和dataOrder</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><br style="WORD-BREAK: break-all"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">origin变量可以有两个取值：IPL_ORIGIN_TL或者IPL_ORIGIN_BL,分别代表图像坐标系原点在左上角或是左下角。相应的，在计算机视觉领域，一个重要的错误来源就是原点位置的定义不统一。例如，图像的来源不同，操作系统不同，视频解码codec不同，存储方式不同等等，都可以造成原点位置的变化。例如，你可能认为你正在从图像上面的脸部附近取样，但实际上你却在图像下方的裙子附近取样。最初时，就应该检查一下你的系统中图像的原点位置，这可以通过在图像上方画个形状等方式实现。<br style="WORD-BREAK: break-all">dataOrder的取值可以是IPL_DATA_ORDER_PIXEL或者IPL_DATA_ORDER_PLANE,这个成员变量定义了多通道图像数据存储时颜色数据的排列方式，如果是IPL_DATA_ORDER_PIXEL,通道颜色数据排列将会是BGRBGR...的交错排列，如果是IPL_DATA_ORDER_PLANE，则每个通道的颜色值在一起，有几个通道，就有几个&#8220;颜色平面&#8221;。大多数情况下，通道颜色数据的排列是交错的。<br style="WORD-BREAK: break-all">widthStep与CvMat中的step类似，是以字节数计算的图像的宽度。成员变量imageData则保存了指向图像数据区首地址的指针。<br style="WORD-BREAK: break-all">最后还有一个重要参数roi(region of interest 感兴趣的区域),这个参数是IplROI结构体类型的变量。IplROI结构体包含了xOffset,yOffset,height,width,coi成员变量，其中xOffset,yOffset是x,y坐标，coi代表channel of interest(感兴趣的通道)。有时候，OpenCV图像函数不是作用于整个图像，而是作用于图像的某一个部分。这是，我们就可以使用roi成员变量了。如果IplImage变量中设置了roi，则OpenCV函数就会使用该roi变量。如果coi被设置成非零值，则对该图像的操作就只作用于被coi指定的通道上了。不幸的是，许多OpenCV函数忽略了coi的值。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">访问图像中的数据</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">就象访问矩阵中元素一样，我们希望用最直接的办法访问图像中的数据，例如，如果我们有一个三通道HSV图像（HSV色彩属性模式是根据色彩的三个基本属性：色相H、饱和度S和明度V来确定颜色的一种方法）,我们要将每个点的饱和度和明度设置成255，则我们可以使用指针来遍历图像，请对比一下，与矩阵的遍历有何不同：<br style="WORD-BREAK: break-all">void sat_sv( IplImage* img ) {</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">for( int y=0; y&lt;height; y++ ) {<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; uchar* ptr = (uchar*) (<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; img-&gt;imageData + y * img-&gt;widthStep&nbsp;<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; );<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; for( int x=0; x&lt;width; x++ ) {<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[3*x+1] = 255;<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[3*x+2] = 255;<br style="WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; }<br style="WORD-BREAK: break-all">}<br style="WORD-BREAK: break-all">}<br style="WORD-BREAK: break-all">注意一下，3*x+1,3*x+2的方法，因为每一个点都有三个通道，所以这样设置。另外imageData成员的类型是uchar*，即字节指针类型，所以与CvMat的data指针类型(union)不同，而不需要象CvMat那样麻烦（还记得step/4,step/8的那种情形吗）。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><br style="WORD-BREAK: break-all"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">roi和widthStep</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; COLOR: rgb(68,68,68); WORD-BREAK: normal; PADDING-TOP: 0px; WORD-WRAP: break-word"><br style="WORD-BREAK: break-all"><span style="FONT-SIZE: x-small; WORD-BREAK: normal; LINE-HEIGHT: 15px; FONT-FAMILY: 'Comic Sans MS'; WORD-WRAP: break-word">roi和widthStep在实际工作中有很重要的作用，在很多情况下，使用它们会提高计算机视觉代码的执行速度。这是因为它们允许对图像的某一小部分进行操作，而不是对整个图像进行运算。在OpenCV中，所有的对图像操作的函数都支持roi,如果你想打开roi,可以使用函数cvSetImageROI(),并给函数传递一个矩形子窗口。而cvResetImageROI()是用于关闭roi的。<br style="WORD-BREAK: break-all">void cvSetImageROI(IplImage* image,CvRect rect);<br style="WORD-BREAK: break-all">void cvResetImageROI(IplImage* image);<br style="WORD-BREAK: break-all">注意，在程序中，一旦使用了roi做完相应的运算，就一定要用cvResetImageROI()来关闭roi,否则，其他操作执行时还会使用roi的定义。</span></p>
</span></span></span></div>
<div><span class=Apple-style-span style="FONT-FAMILY: Arial"><span class=Apple-style-span style="WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">上面这篇文章对IplImage的结构分析的非常清楚。</span></span></div>
<div><span class=Apple-style-span style="FONT-FAMILY: Arial"><span class=Apple-style-span style="WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">###############################################################################</span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">于是我最初使用的方法是利用cvCreateImage新建一个IplImage，之后一个个的对结构体的成员进行赋值。</span></span></div>
<div><span class=Apple-style-span style="FONT-FAMILY: Arial"><span class=Apple-style-span style="WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">其他的成员的赋值都没有问题，而对于<span class=Apple-style-span style="FONT-SIZE: small; COLOR: rgb(47,86,2); FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate">char *imageData;<span class=Apple-converted-space>&nbsp;</span></span><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate"><span class=Apple-style-span style="COLOR: rgb(0,1,2)">的赋值却遇到了问题。</span></span></span></span></div>
<div><span class=Apple-style-span style="FONT-FAMILY: Arial"><span class=Apple-style-span style="WHITE-SPACE: pre; BORDER-COLLAPSE: collapse"><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate"><span class=Apple-style-span style="COLOR: rgb(0,1,2)">我把自己在程序里把从摄像头读取的UYVY数据转换为R=G=B=Y的3通道RGB24的数据，并保存在自己calloc的空间中，最后把这个空间的指针赋给<span class=Apple-style-span style="COLOR: rgb(47,86,2)">imageData</span>这个变量。在程序运行的时候问题来了，出现&#8220;alignment trap......bus error&#8221;的错误，内存对齐出问题了。</span></span></span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">之前遇到过自己定义的结构体，由于内存对齐的问题而出现编译器在结构体中插入空字段而使sizeof（）的值变化的问题。于是，第一反应去查看IplImage这个结构体是否是对齐的，结果发现这个结构体的每个变量都是4字节的，非常完美的对齐。</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">不是结构体的问题，于是我想到给imageData这个指针赋值的问题，因为我是把自己calloc的一个空间的指针赋给它的，如果calloc的这个起始地址不是4字节的整数倍，这样imageData就会出现内存对齐的问题了。</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">于是，把赋值操作删除，改为将calloc后空间中的数据memcpy到imageData经过<span class=Apple-style-span style="FONT-SIZE: 12px; COLOR: rgb(0,0,0); FONT-FAMILY: Arial; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">cvCreateImage初始化后指向的空间。结果证明，这里就是问题所在，修改之后一切正常了。</span></span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">###################################################################################</span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">后记：上面#号内的说法有问题。解决办法是对的，但原因不对。<span class=Apple-style-span style="FONT-SIZE: small; COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate">出现&#8220;alignment trap......bus error&#8221;的错误，并不是单纯因为IplImage的使用有问题，应该和我之前-mabi指定错误，以及在程序中<span class=Apple-style-span style="FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: rgb(51,51,51); LINE-HEIGHT: 18px; FONT-FAMILY: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif">#progma pack(2)这句话<span class=Apple-style-span style="FONT-WEIGHT: normal; FONT-SIZE: small; COLOR: rgb(0,1,2); LINE-HEIGHT: normal; FONT-FAMILY: 'Comic Sans MS'">也有关系。因为在解决了abi了，就没有这个问题了。</span></span></span></span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">经过多次试验，发现IplImage的使用有3种方式可以选择。</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">（1）iplImage = cvCreateImageHeader(cvSize(width,heigth),IPL_DEPTH_8U,1);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">cvSetData(iplImage,pGrayBuffer,width*1);<span class=Apple-tab-span style="WHITE-SPACE: pre"> </span>//第3个参数是行字节数</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">cvReleaseImageheader(&amp;iplImage);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">free(pGrayBuffer);<span class=Apple-tab-span style="WHITE-SPACE: pre"> </span>//pGrayBuffer是程序里用来放灰度数据的空间，由calloc分配</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">（2）iplImage = cvCreateImage(cvSize(width,heigth),IPL_DEPTH_8U,1);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">iplImage-&gt;imageData=pGrayBuffer;</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">iplImage-&gt;imageDataOrigin=pGrayBuffer;</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">cvReleaseImageheader(&amp;iplImage);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">free(pGrayBuffer);<span class=Apple-tab-span style="WHITE-SPACE: pre"> </span></span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">(3)<span class=Apple-tab-span style="WHITE-SPACE: pre"> </span>iplImage = cvCreateImage(cvSize(width,heigth),IPL_DEPTH_8U,1);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">memcpy(iplImage-&gt;imageData,pGrayBuffer,iplImage-&gt;imageSize);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">cvReleaseImage(&amp;iplImage);</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">free(pGrayBuffer);<span class=Apple-tab-span style="WHITE-SPACE: pre"> </span></span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">结论:这3种方式都正确，但推荐用第（1）种。总之，记住一点，如果imageData指向的空间是由cvCreateImage初始化的，那么用cvReleaseImage来释放；如果imageData指向的空间是后来用户指定的，那么用vReleaseImageheader(&amp;iplImage);释放，并由用户自行释放分配的空间。</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">其实（1）cvSetData所做的事情和（2）中两句指针赋值类似。</span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="FONT-SIZE: small">如果分配和释放没搭配好，比如自行分配空间搭配上cvReleaseImage(&amp;iplImage);就会出现&#8220;OpenCV ERROR: Unknown error code -49 (Deallocation error)&#8221;这类错误。</span></span></div>
<div><span class=Apple-style-span style="FONT-FAMILY: Arial"><span class=Apple-style-span style="WHITE-SPACE: pre; BORDER-COLLAPSE: collapse"><span class=Apple-style-span style="COLOR: rgb(0,1,2); FONT-FAMILY: 'Comic Sans MS'"><span class=Apple-style-span style="WHITE-SPACE: normal; BORDER-COLLAPSE: separate"><br></span></span></span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: Arial"><span class=Apple-style-span style="FONT-SIZE: 12px; WHITE-SPACE: pre; BORDER-COLLAPSE: collapse">另外，补充一下，&#8220;利用cvCreateImage新建一个IplImage，之后一个个的对结构体的成员进行赋值&#8221;是非常多余的，cvCreateImage就已经根据参数中的宽度，高度，通道数，颜色深度等信息对结构体的各个成员初始化了，不需要再手动的去赋值。这里要提一下<span class=Apple-style-span style="FONT-SIZE: small; FONT-FAMILY: 'Comic Sans MS'; WHITE-SPACE: normal; BORDER-COLLAPSE: separate"><span class=Apple-style-span style="COLOR: rgb(0,1,2)">char *imageDataOrigin; 这个变量的说明是指针指向一个不同的图像数据结构（不是必须排列的），是为了纠正图像内存分配准备的，实际上初始化后的imageDataOrigin和imageData指向的是同一个地址。既然初始化成这样，我也没去改变它，没有产生什么影响。opencv论坛上<span class=Apple-style-span style="FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: rgb(51,51,51); LINE-HEIGHT: 14px; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif"><a style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: rgb(16,82,137); PADDING-TOP: 0px; TEXT-DECORATION: none" href="http://www.opencv.org.cn/forum/memberlist.php?mode=viewprofile&amp;u=1075&amp;sid=dc4bcd4073bbdcb10fa43253307dd7b8">sunlighta</a>大侠<span class=Apple-style-span style="FONT-WEIGHT: normal; FONT-SIZE: small; COLOR: rgb(0,1,2); LINE-HEIGHT: normal; FONT-FAMILY: 'Comic Sans MS'">的解释是：&#8220;<span class=Apple-style-span style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: 18px; FONT-FAMILY: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif">预留数据接口吧！上面有这么一句话：IplImage结构来自于 Intel Image Processing Library（是其本身所具有的）。OpenCV 只支持其中的一个<span style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">子集。&#8221;</span></span></span></span></span></span></span></span></div>
<div><span class=Apple-style-span style="COLOR: rgb(51,51,51); FONT-FAMILY: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif"><span class=Apple-style-span style="LINE-HEIGHT: 18px"><strong>注：linux下的内存对齐默认是4字节，可以通过以下语句进行修改：</strong></span></span></div>
<div><span class=Apple-style-span style="FONT-SIZE: small; COLOR: rgb(51,51,51); FONT-FAMILY: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif"><span class=Apple-style-span style="FONT-SIZE: 12px; LINE-HEIGHT: 18px"><strong>#progma pack(n)</strong></span></span></div>
</span></span>
<img src ="http://www.cppblog.com/lixiaona0417/aggbug/141155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lixiaona0417/" target="_blank">微风</a> 2011-03-05 11:05 <a href="http://www.cppblog.com/lixiaona0417/archive/2011/03/05/141155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>