2013-09-30 44 views
0

我使用的是openCv 2.4.6。當其中一個參數矩陣不連續時,getAffineTransform失敗?

下不起作用:

cv::Mat src = cv::imread(argv[1], 1); 

    int x11 = src.rows/3; int y11 = src.cols/3; 
    int x12 = src.rows/3; int y12 = src.rows*2/3; 
    int x13 = src.cols*2/3; int y13 = src.rows*2/3; 

    int x21 = 0; int y21 = 0; 
    int x22 = 0; int y22 = src.rows-1; 
    int x23 = src.cols-1; int y23 = src.rows-1; 

#if 1 // doesn't work 
    float src_tri_data[] = {x11, y11, 0, x12, y12, 0, x13, y13, 0}; 
    cv::Mat src_tri(3, 2, CV_32F, src_tri_data, 3*sizeof(float)); 

    float dst_tri_data[] = {x21, y21, 0, x22, y22, 0, x23, y23, 0}; 
    cv::Mat dst_tri(3, 2, CV_32F, dst_tri_data, 3*sizeof(float)); 
#else // works 
    float src_tri_data[] = {x11, y11, x12, y12, x13, y13}; 
    cv::Mat src_tri(3, 2, CV_32F, src_tri_data, 2*sizeof(float)); 

    float dst_tri_data[] = {x21, y21, x22, y22, x23, y23}; 
    cv::Mat dst_tri(3, 2, CV_32F, dst_tri_data, 2*sizeof(float)); 
#endif 

    cv::Mat trans = cv::getAffineTransform(src_tri, dst_tri); 

它失敗,並斷言:

OpenCV的錯誤:斷言失敗(src.checkVector(2 CV_32F)== 3 & & dst.checkVector (2,CV_32F)== 3)in unknown function,file C:\ slave \ builds \ WinInstallerMegaPack \ src \ opencv \ modules \ imgproc \ src \ imgwarp.cpp,line 3612

但是,如果我將矩陣連續工作。 任何想法爲什麼?

回答

0

斷言檢查索引2的行的大小是否包含3個元素,但是您的矩陣每行包含2個元素。
矩陣的大小是不正確的,修改你的矩陣的結構:

cv::Mat src_tri(3, 
       3,    // <=== 3 instead of 2 
       CV_32F, 
       src_tri_data, 
       3*sizeof(float)); 
+0

嗯,我想,一個箭步一個3×2矩陣(或「步」,因爲它被稱爲OpenCV中的術語),因此在改變從2到3的列數似乎不是正確的做法。 –