课程: LEARN OPENCV C++ in 4 HOURS

YouTube: https://www.youtube.com/watch?v=2FYm3GOonhk

Bilibili: https://www.bilibili.com/video/BV11A411T7rL

环境: Opencv 4.6.0 + Visual Studio 2017


1. cvtColor() 颜色转换

1.1. 函数名

// 转换图片的颜色空间
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );

注意:

OpenCV读取图像格式为 BGR , 而非常见的 RGB

code 为颜色空间的编码,可以在一个枚举变量 ColorConversionCodes 中查到。

dstCn 为输出图像的通道数,默认值为 0,也就是默认和源图像保持一致。

1.2. 使用示例

int ImageToGrayScale(string path)
{
    Mat img = imread(path);     // 读取图像
    Mat imgGray;                // 目标图像

    cvtColor(img, imgGray, COLOR_BGR2GRAY); // 转换原图为灰度图像, 储存至目标图像

    imshow("Image", img);     // 显示原图
    imshow("Image_Gray", imgGray); // 显示目标图像
    waitKey(0);                 // 任意键结束
    return 0;
}

2. GaussiaBlur() 高斯模糊

2.1. 函数名

// 给图片添加高斯模糊的效果
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                    double sigmaX, double sigmaY = 0,
                    int borderType = BORDER_DEFAULT );

一般用于边缘检测

ksize 该参数是 Size 类型的,是一个OpenCV自定义的数据类型。用于指定图像或矩形大小的模板类。包含两个成员变量 widthheight。在该函数下,widthheight 只能是正奇数,数字越大模糊效果越明显。如果为0了,则该参数无效,使用 sigmaXsigmaY 来决定模糊程度。

sigmaX, sigmaY 分别为 XY 方向的高斯核标准差。如果 sigmaY0,它将被设置为和 sigmaX 相等。这一对参数的作用同 ksize ,使用这两个参数中的一种即可。

2.2. 使用示例

Mat ImageToBlur(string path)
{
    Mat img = imread(path);     // 读取图像
    Mat imgBlur;                // 目标图像

    GaussianBlur(img, imgBlur, Size(5,5), 5, 0); // 高斯模糊,存至目标图像

    imshow("Image", img);     // 显示原图
    imshow("Image_Blur", imgBlur); // 显示目标图像
    waitKey(0);                 // 任意键结束

    return imgBlur;
}

3. Canny() 边缘检测

3.1. 函数名

// 在输入图像中查找边缘,并使用 Canny 算法在输出图像边缘中标记它们
void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

threshold1 threshold2 这是两个阈值,通过调节这两个阈值来调节边缘检测的效果。

后面两个参数,初学保持默认就可以。

3.2. 使用示例

Mat ImageToCanny(string path)
{
    Mat imgBlur = ImageToBlur(path);    // 先做图像模糊处理
    Mat imgCanny;

    Canny(imgBlur, imgCanny, 15, 35);   // 边缘检测

    imshow("Image_Canny", imgCanny);  // 显示图像
    waitKey(0);                 // 任意键结束

    return imgCanny;
}

4. dilate() 图像扩大

4.1. 函数名

// 通过使用特定的结构元素来扩大图像

void dilate( InputArray src, OutputArray dst, InputArray kernel,
             Point anchor = Point(-1,-1), int iterations = 1,
             int borderType = BORDER_CONSTANT,
             const Scalar& borderValue = morphologyDefaultBorderValue() );

// 获取特点结构
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3)); //Size中的数字越大,效果越明显

kernel 就是上面提到的特点的结构,它本身是 Mat 类型的。

4.2. 使用示例

Mat ImageToDilate(string path)
{
    Mat imgCanny = ImageToCanny(path);  // 先做图像模糊处理
    Mat imgDil;

    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 生成矩形内核,用于扩大

    dilate(imgCanny, imgDil, kernel);   // 扩大边缘

    imshow("Image_Dilate", imgDil);       // 显示图像
    waitKey(0);                         // 任意键结束

    return imgDil;
}

5. erode() 图像侵蚀

5.1. 函数名

//给图像添加侵蚀效果
void erode( InputArray src, OutputArray dst, InputArray kernel,
            Point anchor = Point(-1,-1), int iterations = 1,
            int borderType = BORDER_CONSTANT,
            const Scalar& borderValue = morphologyDefaultBorderValue() );

5.2. 使用示例

Mat ImageToErode(string path)
{
    Mat imgDil = ImageToDilate(path);   // 先做图像边缘扩大处理
    Mat imgErode;

    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 生成矩形内核,用于侵蚀

    erode(imgDil, imgErode, kernel);    // 侵蚀边缘

    imshow("Image_Erode", imgErode);  // 显示图像
    waitKey(0);                         // 任意键结束

    return imgErode;
}
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...