簡體   English   中英

cv :: Mat使用數組初始化

[英]cv::Mat initialization using array

例如,通過初始化后,我遇到了奇怪的行為

#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,gcc版本5.4,OpenCV 3.2上使用eclipse

您沒有使用有效的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) 由於只有一個通道,因此矩陣將使用此標量的第一個值初始化,這是初始化程序列表中的第一個值。

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

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

該代碼不應該編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM