我是 Opencv C++ 的新手。我正在尝试将蒙版与图像进行卷积。为此,我想创建自己的蒙版,以便可以使用 filter2D 数组函数将蒙版与图像进行卷积。我要创建的面具是:

char mask [3][3]=  {{-1,0,1},{-1,0,1},{-1,0,1}};

为此,我尝试了以下代码(生成此掩码):-
Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1));

我已将掩码值打印为
std::cout << kernel;

但我得到的答案是
0, 0, 0;
0, 0, 0;
0, 0, 0

我期待答案是
-1, 0, 1;
-1, 0, 1;
-1, 0, 1

我知道我在正确编写 channel 时犯了一个错误。任何人都可以帮助我理解 channel(CV_8UC1....) 的含义以及如何纠正它并获得正确的输出。

最佳答案

CV_8UC1 表示 1 channel ,8 位,uchar 图像。

标量用于设置每个 channel 的值,而不是每个像素/坐标。

Ex 1:

Mat kernel(3,3, CV_8UC1, Scalar::all(0))

将意味着创建一个 0 的 3X3 矩阵,并且由于它是 CV_8UC1 类型,因此您只能提及一个值,在这种情况下为 0。

EX 2:
Mat kernel(3,3, CV_8UC3, Scalar(0,0,255))

意味着创建一个具有 3 个 channel 的 3X3 矩阵,因为类型是 CV_8UC3 并将 channel 1 设置为 0,将 channel 2 设置为 0,将 channel 3 设置为 255。

因此,为了设置行值,您不能使用标量。
而是这样做:
Mat C = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);

检查 this 以获取更多信息。

希望这可以帮助!

关于c++ - 创建您自己的线性滤波器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48661482/

10-11 23:01
查看更多