簡體   English   中英

逗號分隔的初始化器,用於多維cv :: Mat

[英]comma separated initializer for mutli-dimensional cv::Mat

在許多教程( 例如本教程)中,展示了如何使用逗號分隔的列表初始化opencv Mat。 但是,當我嘗試使用多維Mat這樣做時,我會感到奇怪。

#include "opencv2/core/core.hpp"
#include <iostream>

int main() {
    cv::Mat vect = (cv::Mat_<double>(2, 2, CV_8UC3) << 1,2,3,4,5,6,7,8,9,10,11,12);
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl;
    return 12345;
}

輸出:

vect = 
 [[1, 2], 
  [3, 4]]

可以明確初始化多維Mat嗎?

編輯:另外我在以其他方式初始化它時遇到了麻煩。

int main() {
    int data[2][2][3] = {
        {
            {1,2,3},
            {4,5,6}
        },
        {
            {7,8,9},
            {10,11,12}
        }
    };
    cv::Mat vect = cv::Mat(2, 2, CV_8UC3, data);
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl;
    return 54321;
}

輸出:

vect = 
 [[[1, 0, 0], [0, 2, 0]], 
  [[0, 0, 3], [0, 0, 0]]]

因此,我輸入數組中位於[0][0][1]的元素最終位於Mat中的[0][1][1] 這到底是怎么回事...

對於模板Mat_ ,沒有重載的函數需要Mat_(int rows, int cols, int type) ,其來源為此處

cv::Mat vect = (cv::Mat_<double>(3,4) << 1,2,3,4,5,6,7,8,9,10,11,12);
std::cout << "vect = " << std::endl << " " <<cv::format(vect,Formatter::FMT_PYTHON) << std::endl;

輸出:

vect = 
 [[1, 2, 3, 4],
 [5, 6, 7, 8],
 [9, 10, 11, 12]]

對於非模板Mat,您無需將多維數組作為數據指針參數, Mat::data可以是連續的一維數據指針。 Mat構造函數將處理參數中提供的通道,行和列。

uchar data[] = {1,2,3,4,5,6,7,8,9,10,11,12};
Mat vect(2,2,CV_8UC3,data);
std::cout << "vect = " << std::endl << " " << cv::format(vect,Formatter::FMT_PYTHON) << std::endl;

輸出:

vect = 
 [[[  1,   2,   3], [  4,   5,   6]],
 [[  7,   8,   9], [ 10,  11,  12]]]

暫無
暫無

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

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