2011-12-09 21 views
2

同じ画像の2つの行列の 'step'値が異なるのはなぜですか?OpenCVの同じ画像の2つの行列の 'step'の差

これらのうちの1つはLoadImageM()によって生成され、もう1つは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)> 

ステップ値でこの違いを引き起こしていますか?親切に私を教えてください。ここで

答えて

1

cv.LoadImagecv.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); 
    } 
} 

それが主な違いは、return FROM_IplImagePTR(r)return FROM_CvMatPTR(r)あるように多分stepIplImageの1ベースのインデックスが、CvMatで、ゼロベースのインデックスであるに見えますか?

+0

そうでないかもしれませんか?他の多くの画像では、ステップ値はどちらの場合も同じです。しかし、これらの画像のほとんどは、(1600,1200)、(640,480)などのカメラから取得する標準サイズの画像でした。 これはあまり一般的ではない(681、497)サイズが原因ですが、信じる理由はありません。 –

+0

@AbhinavSood面白い... 'cvCreateImage'や' cvCreateMat'を使うとこれができますか? – mevatron

+0

'org_img = cv.LoadImage( "bed.jpg"、cv.CV_LOAD_IMAGE_COLOR)' 'org_img_mat1 = cv.LoadImageM( "bed.jpg"、cv.CV_LOAD_IMAGE_COLOR)' 'org_img_mat2 = cv.GetMat(org_img、 0) ' '印刷org_img_mat1' '印刷org_img_mat2'はcreateImageまたはCreateMatのいずれかを使用していない@mevatron 。 –

関連する問題