2011-07-12 142 views
3

我在OpenCV中使用cvLoadImage如下加载的二进制图像的宽度和不同widthStep:用于OpenCV的二进制图像

IplImage* myImg=cvLoadImage(<ImagePath> ,-1); //-1 so that it is read as it is. 

当我检查myImg->宽度myImg-> widthStep,我惊讶地发现他们两人的价值略有不同。然后我回过头去查看数据集中的其他图像,发现对于大多数情况下,这两个值是相等的,但是对于一些相当大的图像数量,两者大多数情况下相差1或2。

虽然只有当彩色图像的通道数大于1时,这两个值是不同的,否则它们是一样的。我错了吗?有没有人注意过这种奇怪的行为?

谢谢!

回答

6

显然,如果宽度不是4的倍数,那么为了性能和对齐的原因,它会被填充到4的倍数。所以如果宽度是例如255,那么widthStep将256

3

图像的widthstep可以计算如下:

IplImage *img = cvCreateImage(cvSize(318, 200), IPL_DEPTH_8U, 1); 

int width = img->width; 
int nchannels = img->nChannels; 

int widthstep = ((width*sizeof(unsigned char)*nchannels)%4!=0)?((((width*sizeof(unsigned char)*nchannels)/4)*4) + 4):(width*sizeof(unsigned char)*nchannels); 
0

下一个伪代码是基于@Nizar FAKHFAKH的回答一个小片段。它基本上是一样的东西,但更清楚一点(至少对我来说,jeje)。这里有云:

 int size_row_raw = width * n_channels; 
     int rem = size_row_raw % 4; 
     int width_step = (rem == 0) ? size_row_raw : size_row_raw + rem; 

在这里,我假设尺寸(无符号字符)= 1,我认为这是对C#,因为的sizeof(字节)= 1真。如果我们想将此变量添加到以前的伪代码中,那么更改很简单,只需将第一行更改为如下所示:

int size_row_raw = width * sizeof(datatype_of_interest)* n_channels;

+0

请不要回答2011年的过时问题。c-api不再活着,这是一个死的话题。你只会误导noobs进行思考,这将是一个有效的选择,并引发更多的问题/答案层出不穷。 – berak

+0

我欣赏@berak的评论。正如你所看到的,我是这个新手。我只是认为这对那些仍然被迫使用旧的c-api(像我)的人会有所帮助。感谢您的评论。 – ryuzakyl

+0

我相信第三行可以简化为: 'int width_step = size_row_raw + rem;' –

相关问题