4

I would like to ask how to format a OpenCV Mat in C++ and print it out?

For example, a Mat with double content M, when I wrote

cout<<M<<endl;

I will get

[-7.7898273846583732e-15, -0.03749374753019832; -0.0374787251930463, -7.7893623846343843e-15]

But I want a neat output, for example

[0.0000, -0.0374; -0.0374, 0.0000]

Is there any built-in way to do so?

I know we can use

cout<<format(M,"C")<<endl;

to set the output styple. So I am looking for something similar to this.

Thank you very much!

3

3 Answers 3

5

new versions of OpenCV make it easy!

see cv::Formatter

Mat src;
...
cv::Ptr<cv::Formatter> fmt = cv::Formatter::get(cv::Formatter::FMT_DEFAULT);
fmt->set64fPrecision(4);
fmt->set32fPrecision(4);
std::cout << fmt->format(src) << std::endl;
Sign up to request clarification or add additional context in comments.

Comments

3
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>
#include <iomanip>

using namespace cv;
using namespace std;

void print(Mat mat, int prec)
{      
    for(int i=0; i<mat.size().height; i++)
    {
        cout << "[";
        for(int j=0; j<mat.size().width; j++)
        {
            cout << setprecision(prec) << mat.at<double>(i,j);
            if(j != mat.size().width-1)
                cout << ", ";
            else
                cout << "]" << endl; 
        }
    }
}

int main(int argc, char** argv)
{
    double data[2][4];
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<4; j++)
        {
            data[i][j] = 0.123456789;
        }
    }
    Mat src = Mat(2, 4, CV_64F, &data);
    print(src, 3);

    return 0;
}

Comments

0

This should do the trick:

cout.precision(5);
cout << M << endl;

You may also want to set the format to fixed before:

cout.setf( std::ios::fixed, std::ios::floatfield );

3 Comments

Thank you! I added this setf command first, and then precision command second. The format did changed (now -7.7898273846583732e-15 becomes 0.00000000000000). But it is still too long.
Then the implementation of the printing-method of the matrix overwrites the precision.
@Marius To set the precision with the builtin opencv mat::operator<< see stackoverflow.com/a/40672924/15485

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.