2015-09-18 61 views
1

對於在Matlab我們已經表達使用rdivide例如:OpenCV等效於Matlab的rdivide?

B = bsxfun(@rdivide, A, A(4,:)); 

我們怎樣才能寫出OpenCV的equavalent體現在哪裏?

OpenCV的divide功能,但似乎不能用於具有不同尺寸的矩陣:

Mat t1= Mat::ones(2,3,CV_64FC1); 
Mat t2= Mat::ones(1,3,CV_64FC1); 
Mat dst; 
divide(t1,t2,dst); 

這不工作,所以我們需要複製一個行矩陣匹配T1的尺寸或者在循環中使用1行分隔。

我對OpenCV的(A改性就地)解決方案:

for(int i=0;i<A.rows;++i) 
{ 
    divide(A.row(i),A.row(3),A.row(i)); 
} 

有沒有什麼簡單的方法?

+0

是否OpenCV的代碼產生相同的結果?一旦你到達i = 3,它就會被修改,並且所有更多的行都被這行分割。至少如果我正確地讀你的代碼(從來沒有使用過OpenCV) – Daniel

+0

@Daniel 3是最後一行。 – mrgloom

回答

7

您可以使用OpenCV的repeat函數來複制矩陣。

對於上述MATLAB命令等效OpenCV的代碼如下:

cv::Mat B = A/cv::repeat(A.row(3),4,1); 
4

除了@sgarizvi的解決方案,你會發現這個包裝Matlab的rdivide有所幫助:

#include <opencv2\opencv.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 


Mat rdivide(const Mat& A, const Mat& B) 
{ 
    int nx = A.cols/B.cols; 
    int ny = A.rows/B.rows; 
    return A/repeat(B, ny, nx); 
} 

Mat rdivide(const Mat& A, double d) 
{ 
    return A/d; 
} 


int main() 
{ 
    Mat1f A = (Mat1f(3, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); 
    Mat B = rdivide(A, A.row(2)); // Divide by matrix, works also for cols: e.g. A.col(2) 
    Mat C = rdivide(A, 2);  // Divide by scalar 

    cout << "A: " << endl << A << endl << endl; 
    cout << "B: " << endl << B << endl << endl; 
    cout << "C: " << endl << C << endl << endl; 

    return 0; 
}