[英]How is the comma-separated initializer of OpenCV Mat implemented with C++?
[英]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.