2013-06-25 75 views
3

我想問如何在C++中格式化OpenCV Mat並打印出來?在C++中使用特定格式打印openCV Mat內容

例如,雙內裝物M的墊子,當我寫

cout<<M<<endl; 

我會得到

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

但我希望有一個整潔的輸出,例如

[0.0000, -0.0374; -0.0374, 0.0000] 

有沒有內置的方法可以做到這一點?

我知道我們可以用

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

設置輸出styple。所以我正在尋找類似的東西。

非常感謝!

+1

完全重複的:http://stackoverflow.com/問題/ 16992370/cvmat-matrix-how-to-reduce-digits-to-the-right-of-the-decimal-point-in-cvma – Aurelius

+0

謝謝!我搜索了幾分鐘,但沒有找到任何相關的問題,所以我發佈。這是關鍵字選擇不同的問題。 – PaulYang

+0

[cv :: Mat矩陣,如何減少cv :: Mat中小數點右邊的數字]可能的副本(https://stackoverflow.com/questions/16992370/cvmat-matrix-how-to-減小數字到小數點右側的cvma) –

回答

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; 
} 
0

這應該做的伎倆:

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

你也可能要設置格式,以固定前:

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

謝謝!我先添加了這個setf命令,然後再添加了精確命令。格式確實改變了(現在-7.7898273846583732e-15變成了0.00000000000000)。但它仍然太長。 – PaulYang

+2

然後矩陣的打印方法的執行將覆蓋精度。 – Marius

+0

@Marius要使用內建的opencv'mat :: operator <<'設置精度,請參閱https://stackoverflow.com/a/40672924/15485 –