Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenCV(C+;+;)中打印多维Mat_C++_Opencv_Mat - Fatal编程技术网

C++ 在OpenCV(C+;+;)中打印多维Mat

C++ 在OpenCV(C+;+;)中打印多维Mat,c++,opencv,mat,C++,Opencv,Mat,在OpenCV教程中 以下是创建垫子的示例 int sz[3] = {2,2,2}; Mat L(3,sz, CV_8UC(1), Scalar::all(0)); 这很好,但是当我试图打印垫子时,我的程序崩溃了 cout << "L = " << endl << " " << L << endl << endl; cout要打印n-dim矩阵,可以使用矩阵切片。由于二维矩阵是逐行存储的,三维矩阵是逐平面存储的,因此可

在OpenCV教程中

以下是创建垫子的示例

int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC(1), Scalar::all(0));
这很好,但是当我试图打印垫子时,我的程序崩溃了

cout << "L = " << endl << " " << L << endl << endl;

cout要打印n-dim矩阵,可以使用矩阵切片。由于二维矩阵是逐行存储的,三维矩阵是逐平面存储的,因此可以使用以下代码:

cv::Mat sliceMat(cv::Mat L,int dim,std::vector<int> _sz)
{
cv::Mat M(L.dims - 1, std::vector<int>(_sz.begin() + 1, _sz.end()).data(), CV_8UC1, L.data + L.step[0] * 0);
return M;
}
cv::Mat sliceMat(cv::Mat L,int dim,std::vector_sz)
{
cv::Mat M(L.dims-1,std::vector(_sz.begin()+1,_sz.end()).data(),cv_8UC1,L.data+L.step[0]*0);
返回M;
}
要执行mat切片。要获得更多尺寸,应制作更多切片。示例显示了3维和4维矩阵:

std::cout << "3 dimensions" << std::endl;

std::vector<int> sz = { 3,3,3 };

cv::Mat L;
L.create(3, sz.data(), CV_8UC1);
L = cv::Scalar(255);

std::cout<< sliceMat(L, 1, sz);

std::cout << std::endl;
std::cout <<"4 dimensions"<< std::endl;
sz = { 5,4,3,5 };
L.create(4, sz.data(), CV_8UC1);
L = cv::Scalar(255);
std::cout << sliceMat(sliceMat(L, 1, sz),2, std::vector<int>(sz.begin() + 1, sz.end()));

std::cout要打印n-dim矩阵,可以使用矩阵切片。由于二维矩阵是逐行存储的,三维矩阵是逐平面存储的,因此可以使用以下代码:

cv::Mat sliceMat(cv::Mat L,int dim,std::vector<int> _sz)
{
cv::Mat M(L.dims - 1, std::vector<int>(_sz.begin() + 1, _sz.end()).data(), CV_8UC1, L.data + L.step[0] * 0);
return M;
}
cv::Mat sliceMat(cv::Mat L,int dim,std::vector_sz)
{
cv::Mat M(L.dims-1,std::vector(_sz.begin()+1,_sz.end()).data(),cv_8UC1,L.data+L.step[0]*0);
返回M;
}
要执行mat切片。要获得更多尺寸,应制作更多切片。示例显示了3维和4维矩阵:

std::cout << "3 dimensions" << std::endl;

std::vector<int> sz = { 3,3,3 };

cv::Mat L;
L.create(3, sz.data(), CV_8UC1);
L = cv::Scalar(255);

std::cout<< sliceMat(L, 1, sz);

std::cout << std::endl;
std::cout <<"4 dimensions"<< std::endl;
sz = { 5,4,3,5 };
L.create(4, sz.data(), CV_8UC1);
L = cv::Scalar(255);
std::cout << sliceMat(sliceMat(L, 1, sz),2, std::vector<int>(sz.begin() + 1, sz.end()));

std::cout当您崩溃时会显示什么错误消息(如果有的话)?据我所知,@hammeramr错误消息没有过载可能是这样的dims@hammeramr控制台输出为“代码>异常,在OpCopvTuraceLoCordMulule1.1.EXE:微软C++异常:CV::异常在内存位置0x000 000 BFD9F6D150。在OpCuvVTuoRealAlgRoMeMuldule1.1.EXE中的0x000和FX90967 9E08未处理的异常:微软C++异常:CV::内存位置0x000 000 BFD9F6D150。但是,Stacktrace指向std::ostream运算符什么错误消息(如果有),当你崩溃时会显示吗?据我所知,@hammeramr错误消息没有过载,可能是这样的dims@hammeramr控制台输出为“代码>异常,在OpCopvTuraceLoCordMulule1.1.EXE:微软C++异常:CV::异常在内存位置0x000 000 BFD9F6D150。在OpCuvVTuoRealAlgRoMeMuldule1.1.EXE中的0x000和FX90967 9E08未处理的异常:微软C++异常:CV::内存位置0x000 000 BFD9F6D150。但是,Stacktrace指向std::ostream操作符great-answer。你能看一下吗:?在sliceMat函数中,
int dim
有什么用途?回答得很好。你能看一下吗:?在sliceMat函数中,
int dim
的用法是什么?