2016-04-14 91 views
1

所以我有Main.hpp與全球三大墊(承擔與我),我想,以填補雙打,我也有一個打印方法OpenCV的C++墊MADNESS

所以對象

Main class { 
... 
Mat FIXED; 
Mat one; 
Mat two; 
... 
} 

,並在我的Main.cpp的我有

void Main::printMat(Mat mat) { 
    int rows = mat.rows; 
    int cols = mat.cols; 
    for (int j = 0, j < cols; j++) { 
     for (int i = 0, i < rows; i++) { 
      printf("%lf ", mat.at<double>(i,j)); 
     } 
     printf("\n"); 
    } 
} 

因此,對於任何矩陣輸入它的一切門店罰款。

printMat(one); <--this works 

這正常,但後來我做

two = FIXED.clone(); 

那麼這休息,我不知道爲什麼HELP

printMat(one); <--this doesnt work 

如果我註釋掉.clone ()線它的工作原理,如果我做一個相同大小的空白矩陣並保存到FIXED它不起作用。

+1

所有的矩陣都是'CV_64FC1'類型的?如果沒有,這可能會中斷。你不應該從類Main的一個實例調用'printMat'嗎?順便說一句,你可以簡單地使用'cout << mat << endl;'打印矩陣 – Miki

+0

認爲它默認爲1通道不確定。無論如何,這是我的錯誤,我寫了一個答案。猜猜菜鳥錯誤引用vs值錯誤,但容易混淆。 – Vroosh

+0

我不明白你爲什麼在打印時轉置矩陣(你的代碼在一行中打印每列的值,然後換行並轉到下一行),也不知道爲什麼你不使用'cout',但你可以(int j = 0,j (i,j)); } printf(「\ n」); } –

回答

1

對於任何人與此掙扎,原因是我是如何創建一個數組。

所以我做了一個打印方法最初是因爲

cout << someMat << endl; 

是給我奇異數

原來那是錯在那裏,它應該給我,我存儲在正常值。

我是通過傳遞數組[行] [col]使用

void foo() { 
    one = Mat(Array.rows, Array.cols, CV_64F, Array); 
} 

void bar() { 
printMat(one)//error happens here 
} 

main (...) { 
    foo(); 
    bar(); 
} 

原來的構造函數使用數組的參考的數組和不是的值,所以當我離開的方法我失去了那一點的內存垃圾收集器。

事實上,在我提到的這一行之後,這只是巧合。 (因爲這是一種不同的方法,GC決定清除)

+2

在C++中沒有垃圾收集器; D1 – Miki

+0

ahaha隨意修復,這個C++的東西是如此超出我的聯盟 – Vroosh

+0

我不能。我甚至不知道問題出在哪裏,因爲你沒有顯示所有相關的代碼。我想你可以刪除這個問題,因爲你找到了一個修復程序,但是沒有關於其他如何從中受益的信息。 – Miki