Python 差异在';步骤';对于OpenCV中相同图像的两个矩阵

Python 差异在';步骤';对于OpenCV中相同图像的两个矩阵,python,opencv,Python,Opencv,为什么同一图像的两个矩阵的“步长”值不同 其中一个由LoadImageM()生成,另一个由GetMat()在图像加载LoadImage()后生成。我的代码是: import cv2.cv as cv def main(): org_win = 'Original' cv.NamedWindow(org_win, cv.CV_WINDOW_AUTOSIZE) org_img = cv.LoadImage("bed.jpg", cv.CV_LOAD_IMAGE_COLOR)

为什么同一图像的两个矩阵的“步长”值不同

其中一个由
LoadImageM()
生成,另一个由
GetMat()
在图像加载
LoadImage()
后生成。我的代码是:

import cv2.cv as cv
def main():
    org_win = 'Original'
    cv.NamedWindow(org_win, cv.CV_WINDOW_AUTOSIZE)
    org_img = cv.LoadImage("bed.jpg", cv.CV_LOAD_IMAGE_COLOR)
    cv.ShowImage(org_win, org_img)

    org_img_mat1 = cv.LoadImageM("bed.jpg", cv.CV_LOAD_IMAGE_COLOR)
    org_img_mat2 = cv.GetMat(org_img, 0)

    print org_img_mat1
    print org_img_mat2

    cv.WaitKey(0)
    cv.DestroyWindow(org_win)

if __name__ == '__main__': main()
我得到的结果是:

<cvmat(type=42424010 8UC3 rows=497 cols=681 step=2043 )>
<cvmat(type=42420010 8UC3 rows=497 cols=681 step=2044 )>


是什么导致阶跃值的差异?请告诉我。

这是
cv.LoadImage
cv.LoadImageM
的源代码:

static PyObject *pycvLoadImage(PyObject *self, PyObject *args, PyObject *kw)
{
  const char *keywords[] = { "filename", "iscolor", NULL };
  char *filename;
  int iscolor = CV_LOAD_IMAGE_COLOR;

  if (!PyArg_ParseTupleAndKeywords(args, kw, "s|i", (char**)keywords, &filename, &iscolor))
    return NULL;

  // Inside ALLOW_THREADS, must not reference 'filename' because it might move.
  // So make a local copy 'filename_copy'.
  char filename_copy[2048];
  strncpy(filename_copy, filename, sizeof(filename_copy));

  IplImage *r;
  Py_BEGIN_ALLOW_THREADS
  r = cvLoadImage(filename_copy, iscolor);
  Py_END_ALLOW_THREADS

  if (r == NULL) {
    PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename);
    return NULL;
  } else {
    return FROM_IplImagePTR(r);
  }
}

static PyObject *pycvLoadImageM(PyObject *self, PyObject *args, PyObject *kw)
{
  const char *keywords[] = { "filename", "iscolor", NULL };
  char *filename;
  int iscolor = CV_LOAD_IMAGE_COLOR;

  if (!PyArg_ParseTupleAndKeywords(args, kw, "s|i", (char**)keywords, &filename, &iscolor))
    return NULL;

  // Inside ALLOW_THREADS, must not reference 'filename' because it might move.
  // So make a local copy 'filename_copy'.
  char filename_copy[2048];
  strncpy(filename_copy, filename, sizeof(filename_copy));

  CvMat *r;
  Py_BEGIN_ALLOW_THREADS
  r = cvLoadImageM(filename_copy, iscolor);
  Py_END_ALLOW_THREADS

  if (r == NULL) {
    PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename);
    return NULL;
  } else {
    return FROM_CvMatPTR(r);
  }
}

看起来主要的区别是
从IplImagePTR(r)
返回与
从CvMatPTR(r)
返回可能
步骤
IplImage
中是基于一个索引的,但在
CvMat
中是基于零的索引吗?

?对于许多其他图像,这两种情况下的步长值相同。然而,几乎所有这些图像都是从相机上获得的标准尺寸,如(1600、1200)、(640、480)等。不太常见的(681497)尺寸可能是造成这种行为的原因,但我没有理由相信。@AbhinavSood有趣。。。当您使用
cvCreateImage
cvCreateMat
时,它会这样做吗?
org\u img=cv.LoadImage(“bed.jpg”,cv.cv\u LOAD\u IMAGE\u COLOR)
org\u img\u mat1=cv.LoadImageM(“bed.jpg”,cv.cv\u LOAD\u IMAGE\u COLOR)org\u img\u mat2=cv.GetMat(org\u img,0)
print org\u img\u mat1
print org\u img\u mat2
@mevatron不使用CreateImage或CreateMat。