如何将cv :: Mat的所有奇数行设置为标量值?

时间:2017-01-31 18:09:33

标签: opencv

我想将nxm cv :: Mat的所有奇数行设置为标量值。这个问题有蛮力的方法,但我想知道是否有更优雅的东西。

从这个问题扩展,我想将不同通道的所有偶数行设置为标量值。

2 个答案:

答案 0 :(得分:1)

没有OpenCV内置函数可以做到这一点,但这可以通过3行代码轻松完成。

#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    // The new value for the rows
    uchar some_value = 100;

    // Your matrix (here random initialized)
    Mat1b mat(5, 3, uchar(0));
    randu(mat, 0, 10);

    // Set all even rows to some_value
    for (int r = 0; r < mat.rows; r += 2) {
        for (int c = 0; c < mat.cols; ++c) {
            mat(r, c) = some_value;
        }
    }

    return 0;
}

是的,这可能是你叫做“暴力”,但这是对矩阵访问次数较少的方法。 它也非常快,你最终可以通过指针实现它更快(这里有3个通道的例子):

#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    Vec3b some_value(100, 101, 102);
    Mat3b mat(5, 3, Vec3b(0,0,0));
    randu(mat, Scalar(0, 0, 0), Scalar(10, 10, 10));

    for (int r = 0; r < mat.rows; r += 2) {
        Vec3b* ptr = mat.ptr<Vec3b>(r);
        for (int c = 0; c < mat.cols; ++c) {
            ptr[c] = some_value;
        }
    }

    return 0;
}

您还可以创建一个奇数行为白色(255)的蒙版,偶数行为黑色(0),并使用cv::setTo根据蒙版设置值。然而,这可能要慢得多,因为您需要 i)创建掩码,并且 ii)访问矩阵中的每个像素(尽管可能利用优化代码)。 / p>

答案 1 :(得分:0)

不确定速度,但我想OP提到MATLAB矩阵操作的优雅,并确定其中一些已导入OpenCV,例如。

cv::Mat m(8,15,CV_32FC1,cv::Scalar(0));
for (int i=0;i<m.rows;i+=2)
    m.row(i).setTo( 32 );

同样,您可以使用cv::Mat函数分别为每列构建cv::Mat::col(int i)标头。