【问题标题】:OpenCV equivalent for Matlab's rdivide?与 Matlab 的 rdivide 等效的 OpenCV?
【发布时间】:2015-09-18 20:32:11
【问题描述】:

例如我们在 Matlab 中使用rdivide 来表达:

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

我们如何为opencv编写等价表达式?

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 modified inplace):

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

有没有更简单的方法?

【问题讨论】:

  • openCV 代码是否产生相同的结果?一旦达到 i=3,它就会被修改,并且所有其他行都被该行划分。至少如果我正确阅读了您的代码(从未使用过 OpenCV)
  • @Daniel 3 是最后一行。

标签: matlab opencv


【解决方案1】:

您可以使用 OpenCV 的 repeat 函数来复制矩阵。

上述 MATLAB 命令的等效 OpenCV 代码如下:

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

【讨论】:

    【解决方案2】:

    除了@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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 2014-05-29
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多