OpenCV中二值图像的宽度和宽度步长不同

OpenCV中二值图像的宽度和宽度步长不同,opencv,Opencv,我使用cvLoadImage在OpenCV中加载一个二进制图像,如下所示: IplImage* myImg=cvLoadImage(<ImagePath> ,-1); //-1 so that it is read as it is. IplImage*myImg=cvLoadImage(,-1)//-1以便按原样阅读。 当我检查myImg->width和myImg->widthStep时,我惊讶地发现它们的值略有不同。然后,我回头查看数据集中的其他图像,发现在大多数情况下,这两

我使用cvLoadImage在OpenCV中加载一个二进制图像,如下所示:

IplImage* myImg=cvLoadImage(<ImagePath> ,-1); //-1 so that it is read as it is.
IplImage*myImg=cvLoadImage(,-1)//-1以便按原样阅读。
当我检查myImg->widthmyImg->widthStep时,我惊讶地发现它们的值略有不同。然后,我回头查看数据集中的其他图像,发现在大多数情况下,这两个值是相等的,但是对于一些相当数量的图像,这两个值的差异主要为1或2

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


谢谢

显然,如果宽度不是4的倍数,出于性能和对齐原因,它会被填充到4的倍数。因此,如果宽度为255,则宽度步长为256。

图像的宽度步长可按如下方式计算:

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);

下一个伪代码是基于@Nizar FAKHFAKH答案的一个小片段。这基本上是一样的,但更清楚一点(至少对我来说,杰)。下面是:

        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;
这里我假设size(unsigned char)=1,我认为这对于c是正确的,因为sizeof(byte)=1。如果我们想将此变量添加到前面的伪代码中,那么更改很简单,只需将第一行更改为:


int size_row_raw=宽度*sizeof(感兴趣的数据类型)*n个通道

从2011年开始,请不要回答过时的问题。c-api不再活跃,这是一个死话题。你只会误导noobs,让他们认为这仍然是一个有效的选择,并引发更多的问题/答案层出不穷。正如你所看到的,我在这方面是新手。我只是觉得它对那些仍然被迫使用旧的c-api的人(像我一样)会有帮助。谢谢你的评论。我相信第三行可以简化为:
int width\u step=size\u row\u raw+rem@LeonardoConstantino你完全正确。谢谢你的改进。在C++ API中有没有一个WITHSTEP(C-API)的对应关系?