2017-07-07 66 views
0

墊初始化我經歷例如通過CV ::使用陣列

#include <iostream> 
#include <opencv2/opencv.hpp> 

int main() { 
    cv::Mat h = cv::Mat(2, 2, CV_32F, {1.0, 2.0, 1.0, 0.0}); 
    std::cout << h << std::endl; 
    return 0; 
} 

COUT打印出[1,1初始化後一個奇怪的行爲; 1,1]。 WTF剛剛發生?我在ubuntu上使用eclipse,gcc版本5.4,OpenCV 3.2

+0

您能否提供[MCVE]? – Jonas

回答

4

您沒有使用有效的Mat構造函數。您有幾種選擇:

  1. 從一個數組:

    float pf[] = { 1.f, 2.f, 3.f, 4.f }; 
    Mat1f m1(2, 2, pf); 
    

    std::vector<float> vf = { 1.f, 2.f, 3.f, 4.f }; 
    Mat1f m2(2, 2, vf.data()); 
    
  2. 用逗號初始化:

    Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f); 
    
  3. 如果矩陣小,你可以我們ËMatx

    Matx22f m4(1.f, 2.f, 3.f, 4.f); 
    

。注意,Mat1fMat_<float>一個typedef,這是CV_32FC1類型的Mat


用你的方法,因爲{1.0, 2.0, 1.0, 0.0}結構cv::Scalar,所以你調用構造函數Mat(int rows, int cols, int type, cv::Scalar)不起作用。由於您只有1個通道,因此矩陣將使用此標量的第一個值進行初始化,這是初始化程序列表中的第一個值。

請注意,這只是一個巧合,因爲您的矩陣有4個元素(Scalar s支持的最大數量)。如果使用更多數量的元素:

cv::Mat h(2, 3, CV_32F, {3.f, 2.f, 1.f, 0.f, 2.f, 5.f}); 

代碼不應該編譯。

+0

我的方法與使用數組的第一次初始化有什麼不同? – YuZ

+0

新增瞭解釋@YuZ – Miki