2014-09-11 42 views
0

我想知道如何將矩陣作爲函數中的可選參數傳遞。如果沒有給出參數,那麼它被設置爲一個單位矩陣。OpenCV:將矩陣作爲可選參數傳遞

如果我這樣做

Mat function(const Mat &I, Mat &matrix=Mat::eye(2, 3, CV_32F)) 
{ 
    /// some code 

    return matrix; 
} 

然後我得到以下錯誤:

error: could not convert ‘cv::Mat::eye(int, int, int)(3, 5)’ from ‘cv::MatExpr’ to ‘cv::Mat&’

在此先感謝您的任何建議。

+0

你有沒有按引用傳遞?你爲什麼想通過參考? – Micka 2014-09-11 10:46:55

+0

不,我不知道。我只是想在參數中傳遞矩陣,修改它,然後返回它。 – Khue 2014-09-11 10:53:23

+0

所以只是刪除'&'應該工作我猜。 – Micka 2014-09-11 10:54:15

回答

3

因爲C++ does not allow a temporary (the default value in this case) to be bound to non-const reference. 你有三個(至少)選擇您收到此問題:

Mat function(const Mat &I, const Mat & matrix = Mat::eye(2, 3, CV_32F)) 

Mat function(const Mat &I, Mat const & matrix = Mat::eye(2, 3, CV_32F)) 

Mat function(const Mat &I, Mat matrix = Mat::eye(2, 3, CV_32F)) 

或者作爲berak說,你可以使默認值爲空,並使用進行測試:

Mat function(const Mat &I, Mat & matrix = Mat()) 
+0

對於前兩個,是否可以修改'matrix'然後返回?我嘗試了第三,但出現以下錯誤: '錯誤:爲 'CV ::墊tMatch_lk(常量CV ::墊&,常量CV ::墊及,CV :: MAT)'' 我」參數3給出的默認參數m在64位Ubuntu 14.04上。 – Khue 2014-09-11 10:59:19

+0

對於前兩個,Mat是const,因此您不能簡單地更改Mat本身,但可以更改由matrix.data指向的圖像數據,例如, 'float * p =(float *)matrix.ptr (0); p [1] = 55.0f;'。當然,你可以返回矩陣。對於第三種情況,我不得不這樣稱呼它:'Mat m = function(Mat :: zeros(2,2,CV_32F),(const Mat)Mat :: eye(4,4,CV_32F));'(VS2012 ) 如果你真的不需要參考,我會擺脫它們。 – Bull 2014-09-11 13:53:51

+0

謝謝。如果我定義'function()'BEFORE'main()',第三個解決方案就可以工作。否則它不起作用(即,如果它在之前被聲明,但在函數'main()'之後定義)。但我不明白爲什麼。 – Khue 2014-09-11 15:22:52

2

我認爲通過引用並沒有多大意義。

通過引用傳遞的一個原因是使用參數作爲返回值(因此修改輸入),但默認值沒有多大意義。

通過引用傳遞的另一個原因可能是某些性能改進,以免複製整個數據。這對於cv :: Mat來說並不重要,因爲它只是一個標題,而且數據字段無論如何都被引用/指針複製。如果必須經常調用該函數,那麼可以通過不復制標題來提高性能,但在這種情況下,您不希望有一個默認值,它會始終創建一個新的cv :: Mat。

所以我的解決問題的方法是按值傳遞:

cv::Mat function(cv::Mat matrix = cv::Mat::eye(2,3, CV_32F)) 
{ 
    return matrix; 
} 

int main() 
{ 
    std::cout << function() << "\n\n" ; 

    std::cout << function(cv::Mat::zeros(2,3, CV_32F)) << std::endl; 

    return 0; 
} 

給我這個終端輸出通緝/預期:

[1, 0, 0; 
    0, 1, 0] 

[0, 0, 0; 
    0, 0, 0] 
+0

Thanks。我想到了。我在main函數之前聲明瞭該函數,並在之後定義它(參見下面的代碼),所以它不起作用。但我不明白爲什麼它不工作:\ '#包括... 墊功能(太矩陣=墊::眼(2,3,CV_32F)); INT主() {...} 墊功能(墊矩陣=墊::眼(2,3-,CV_32F)) {...}' – Khue 2014-09-11 15:17:48

+0

Micka:因爲@B ...張貼了他2小時前回答,我認爲這些學分應該先交給他。但我很感謝你的回答。再次感謝。 +1。 – Khue 2014-09-11 15:27:21

+0

多數民衆贊成在我身上。只是想解釋爲什麼通過參考在我的觀點中沒有多少意義,並且想爲我自己嘗試一個,因爲你在評論中提到它給了你編譯錯誤。 – Micka 2014-09-11 15:29:52