创建自己的线性过滤器 我是OpenCV C++的新手。我想把面具和图像结合起来。为此,我想创建自己的遮罩,以便使用filter2D数组函数将遮罩与图像进行卷积。我要创建的掩码是: char mask [3][3]= {{-1,0,1},{-1,0,1},{-1,0,1}};

创建自己的线性过滤器 我是OpenCV C++的新手。我想把面具和图像结合起来。为此,我想创建自己的遮罩,以便使用filter2D数组函数将遮罩与图像进行卷积。我要创建的掩码是: char mask [3][3]= {{-1,0,1},{-1,0,1},{-1,0,1}};,c++,image,opencv,C++,Image,Opencv,为此,我尝试了以下代码(生成此掩码):- 我已将掩码值打印为 std::cout << kernel; CV_8UC1表示1通道8位uchar图像 标量用于设置每个通道的值,而不是每个像素/坐标 ex1: Mat kernel(3,3, CV_8UC1, Scalar::all(0)) 这意味着创建一个3X3的0矩阵,因为它是CV_8UC1类型,所以只能提到一个值,在本例中为0 ex2: Mat kernel(3,3, CV_8UC3, Scalar(0,0,255)) 由

为此,我尝试了以下代码(生成此掩码):-

我已将掩码值打印为

std::cout << kernel;

CV_8UC1表示1通道8位uchar图像

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

ex1:

Mat kernel(3,3, CV_8UC1, Scalar::all(0)) 
这意味着创建一个3X3的0矩阵,因为它是CV_8UC1类型,所以只能提到一个值,在本例中为0

ex2:

Mat kernel(3,3, CV_8UC3, Scalar(0,0,255)) 
由于类型为CV_8UC3,意味着创建具有3个通道的3X3矩阵,并将通道1设置为0,通道2设置为0,通道3设置为255

因此,为了设置行值,不能使用标量。 而是这样做:

Mat C = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);

matc=(Mat_u3,3)如果要为
filter2D
创建一个
negative
元素的
内核
,则不应使用
CV_8UC1
的数据类型
无符号类型中没有负值

Mat-kernel(3,3,CV_8UC1,Scalar(-1,0,1));
意味着创建一个信号通道无符号字符内核。您将
Scalar(-1,0,1)
设置为
kernel
,然后只使用
第一个元素(即双-1)
,而
saturate\u-cast(-1)=0

通常,使用
CV_32FC1


例如:

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

int main(){
    float mask[9] = {-1,0,1, -1, 0, 1, -1,0,1};
    Mat kernel(3,3, CV_32FC1);
    memcpy(kernel.data, mask, sizeof(float)*9);
    cout << kernel<<endl;
}

类似的问题:

Mat kernel(3,3,CV_8UC1,Scalar(-1,0,1));意味着您将第一个通道设置为-1,第二个通道设置为0,第三个通道设置为1。但由于您只有一个通道矩阵,因此仅使用第一个通道:-1。但由于您具有无符号类型,它将饱和为0。因此,示例图像的每个像素都是0。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main(){
    float mask[9] = {-1,0,1, -1, 0, 1, -1,0,1};
    Mat kernel(3,3, CV_32FC1);
    memcpy(kernel.data, mask, sizeof(float)*9);
    cout << kernel<<endl;
}
[-1, 0, 1;
 -1, 0, 1;
 -1, 0, 1]