如何更改cv :: Mat中所有像素的值

时间:2018-11-16 00:54:58

标签: c++ ios xcode opencv matrix

我有一个简单的函数,试图在单个通道cv :: Mat中循环遍历所有像素。它无法正常运行。我正在ios sim上的xcode中运行它。

cv::Mat fillEdge(cv::Mat floated) {
    float currentColor = 255.0;
    cv::Size shape = floated.size();
    int h = shape.height;
    int w = shape.width;

    int count = 1;

    for(int y = 0; y!= h; y++) {
        for(int x = 0; x!= w; x++) {
            cv::Point2i p(y, x);
            floated.at<int>(p) = currentColor;
        }
    }
    std::cout << floated.channels() << std::endl;
    // prints 1


    std::cout << floated << std::endl;
    return floated;
}

由于某种原因,它会打印出条纹图像。

enter image description here enter image description here

这是函数返回之前cv :: Mat的输出的样子

[255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,
0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,
0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,
0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   0, 255,   0,   0,   ...

2 个答案:

答案 0 :(得分:1)

您应该使用setTo

cv::Mat fillEdge(cv::Mat floated) {
    float currentColor = 255.0;
    floated.setTo(cv::Scalar(currentColor));
    return floated;
}

答案 1 :(得分:0)

好的,我更改了for循环条件检查,更改了Point2i的定义,并将at方法的模板类型从int更改为{{ 1}},以保持类型的完整性。

这现在应该可以工作:

float