在OpenCV C++中打印出(Mat)矩阵的值

aho*_*fer 57 c++ opencv

我想使用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

或者更好地使用新的C++接口(感谢SSteve)

cv::Mat M;
cout << "M = " << endl << " "  << M << endl << endl;
Run Code Online (Sandbox Code Playgroud)

  • 辉煌.我应该先把一个垫子推到一边,看看是否有人实施了<<.多一点实验和信任会为我带来回报. (3认同)
  • 要添加的一件事:确保包含“#include &lt;opencv2/core.hpp&gt;”而不是“#include &lt;opencv2/core/mat.hpp&gt;”,因为该运算符在其他地方重载。 (2认同)

Jay*_*llo 7

如果您使用的是 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)

输出如下:

在此处输入图片说明