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

时间:2011-11-01 18:22:37

标签: c++ opencv

我想使用cout将OpenCV中矩阵的值转储到控制台。我很快就知道我不了解OpenvCV的类型系统,也不了解C ++模板,无法完成这个简单的任务。

请读者发帖(或指向我)一个打印Mat的小功能或代码片段吗?

此致 亚伦

PS:使用较新的C ++ Mat接口而不是较旧的CvMat接口的代码优先。

4 个答案:

答案 0 :(得分:81)

查看Accesing a matrix element in the "Mat" object (not the CvMat object) in OpenCV C++的第一个答案 然后循环遍历cout << M.at<double>(0,0);中的所有元素,而不仅仅是0,0

或者更好地使用new C++ interface(感谢SSteve

cv::Mat M;

cout << "M = "<< endl << " "  << M << endl << endl;

答案 1 :(得分:3)

#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)
{
    double data[4] = {-0.0000000077898273846583732, -0.03749374753019832, -0.0374787251930463, -0.000000000077893623846343843};
    Mat src = Mat(1, 4, CV_64F, &data);
    for(int i=0; i<4; i++)
        cout << setprecision(3) << src.at<double>(0,i) << endl;

    return 0;
}

答案 2 :(得分:3)

我认为使用matrix.at<type>(x,y)并不是通过Mat对象进行迭代的最佳方法! 如果我没记错的话matrix.at<type>(x,y)每次调用时都会从矩阵的开头迭代(虽然我可能错了)。 我建议使用cv::MatIterator_

cv::Mat someMat(1, 4, CV_64F, &someData);;
cv::MatIterator_<double> _it = someMat.begin<double>();
for(;_it!=someMat.end<double>(); _it++){
    std::cout << *_it << std::endl;
}

答案 3 :(得分: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;

如下所示的输出,您可以看到它更具可读性,有关更多信息,请参见here

enter image description here

但是在大​​多数情况下,不需要在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;
}

输出如下:

enter image description here