我是 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 的值,而不是每个像素/坐标。
示例 1:
Mat kernel(3,3, CV_8UC1, Scalar::all(0))
这意味着创建一个包含 0 的 3X3 矩阵,并且由于它是 CV_8UC1 类型,您只能提及一个值,在本例中为 0。
例子 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/