我想使用 cout 将 OpenCV 中的矩阵值转储到控制台。我很快了解到我对 OpenvCV 的类型系统和 C++ 模板的了解不足以完成这个简单的任务。
请读者发布(或指向我)一个打印 Mat 的小函数或代码片段吗?
问候,亚伦
PS:使用较新的 C++ Mat 接口而不是较旧的 CvMat 接口的代码是优先的。
原文由 ahoffer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想使用 cout 将 OpenCV 中的矩阵值转储到控制台。我很快了解到我对 OpenvCV 的类型系统和 C++ 模板的了解不足以完成这个简单的任务。
请读者发布(或指向我)一个打印 Mat 的小函数或代码片段吗?
问候,亚伦
PS:使用较新的 C++ Mat 接口而不是较旧的 CvMat 接口的代码是优先的。
原文由 ahoffer 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您使用的是 opencv3,则可以像 python numpy style
一样打印 Mat:
Mat xTrainData = (Mat_<float>(5,2) << 1, 1, 1, 1, 2, 2, 2, 2, 2, 2);
cout << "xTrainData (python) = " << endl << format(xTrainData, Formatter::FMT_PYTHON) << endl << endl;
输出如下,您可以看到它更具可读性,请参阅 此处 了解更多信息。
但大多数情况下,不需要输出 Mat 中的所有数据,可以按行范围输出,如 0 ~ 2 行:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <iomanip>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//row: 6, column: 3,unsigned one channel
Mat image1(6, 3, CV_8UC1, 5);
// output row: 0 ~ 2
cout << "image1 row: 0~2 = "<< endl << " " << image1.rowRange(0, 2) << endl << endl;
//row: 8, column: 2,unsigned three channel
Mat image2(8, 2, CV_8UC3, Scalar(1, 2, 3));
// output row: 0 ~ 2
cout << "image2 row: 0~2 = "<< endl << " " << image2.rowRange(0, 2) << endl << endl;
return 0;
}
输出如下:
原文由 Jayhello 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
请参阅 在 OpenCV C++ 中访问“Mat”对象(不是 CvMat 对象)中的矩阵元素 的第一个答案
然后只需循环
cout << M.at<double>(0,0);
中的所有元素,而不仅仅是 0,0或者更好的是使用 C++ 接口: