我想使用cout将OpenCV中矩阵的值转储到控制台.我很快就了解到我不了解OpenvCV的类型系统,也不了解C++模板以完成这个简单的任务.
请读者发帖(或指向我)一个打印Mat的小功能或代码片段吗?
此致,亚伦
PS:使用较新的C++ Mat接口而不是较旧的CvMat接口的代码是优先的.
Mar*_*ett 84
请参阅OpenCV C++中的"Mat"对象(不是CvMat对象)中的Accesing一个矩阵元素的第一个答案
然后只循环遍历所有元素cout << M.at<double>(0,0); 而不仅仅是0,0
cv::Mat M;
cout << "M = " << endl << " " << M << endl << endl;
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 opencv3,您可以像这样打印 Mat python numpy style:
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;
Run Code Online (Sandbox Code Playgroud)
输出如下,您可以看到它更具可读性,请参阅此处 了解更多信息。
但在大多数情况下,不需要输出 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;
}
Run Code Online (Sandbox Code Playgroud)
输出如下: