26 OpenCV 查找边缘

在这里插入图片描述

findContours 发现边缘

cv::findContours(
InputOutputArray  binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit
 OutputArrayOfArrays  contours,//  全部发现的轮廓对象
OutputArray,  hierachy// 图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。
int mode, //  轮廓返回的模式
int method,// 发现方法
Point offset=Point()//  轮廓像素的位移,默认(0, 0)没有位移
)

drawContours 绘制边缘

drawContours(
InputOutputArray  binImg, // 输出图像
 OutputArrayOfArrays  contours,//  全部发现的轮廓对象
Int contourIdx// 轮廓索引号
const Scalar & color,// 绘制时候颜色
int  thickness,// 绘制线宽
int  lineType ,// 线的类型LINE_8
InputArray hierarchy,// 拓扑结构图
int maxlevel,// 最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮廓
Point offset=Point()// 轮廓位移,可选

大致流程

  • 输入图像转为灰度图像cvtColor
  • 一系列降噪处理
  • 一系列图像的增强
  • 一系列阈值处理
  • 使用Canny进行边缘提取,得到二值图像
  • 使用findContours寻找轮廓
  • 使用drawContours绘制轮廓

示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

Mat src, dst; // 定义原始图像和结果图像
const char* output_win = "findcontours-demo"; // 定义输出窗口名称
int threshold_value = 100; // 初始阈值设为100
int threshold_max = 255; // 最大阈值为255
RNG rng; // 随机数生成器

// Contours演示函数声明
void Demo_Contours(int, void*);

int main(int argc, char** argv) {
    src = imread("D:/vcprojects/images/happyfish.png"); // 读取图像
    if (src.empty()) {
        printf("could not load image...\n");
        return -1;
    }
    
    namedWindow("input-image"); // 创建输入图像窗口
    namedWindow(output_win); // 创建输出图像窗口
    imshow("input-image", src); // 在输入窗口中显示原始图像
    
    cvtColor(src, src, CV_BGR2GRAY); // 将彩色图像转换为灰度图像

    const char* trackbar_title = "Threshold Value:"; // 创建滑动条标题
    createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours); // 创建阈值滑动条
    Demo_Contours(0, 0); // 初始化Contours函数

    waitKey(0); // 等待按键
    return 0;
}

void Demo_Contours(int, void*) {
    Mat canny_output; // Canny边缘检测输出
    vector<vector<Point>> contours; // 存储轮廓点集
    vector<Vec4i> hierachy; // 轮廓层级关系

    // 进行Canny边缘检测
    Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);

    // 查找图像中的轮廓
    findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

    // 创建与原始图像相同大小的空白图像
    dst = Mat::zeros(src.size(), CV_8UC3);

    // 循环绘制轮廓
    RNG rng(12345); // 随机数生成器
    for (size_t i = 0; i < contours.size(); i++) {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); // 随机颜色
        drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0)); // 绘制轮廓
    }

    imshow(output_win, dst); // 在输出窗口中显示结果图像
}

在这里插入图片描述

相关推荐

  1. Python-OpenCV-边缘检测

    2024-03-22 12:38:04       39 阅读
  2. Python-OpenCV-边缘检测

    2024-03-22 12:38:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 12:38:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 12:38:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 12:38:04       87 阅读
  4. Python语言-面向对象

    2024-03-22 12:38:04       96 阅读

热门阅读

  1. linux bash脚本

    2024-03-22 12:38:04       43 阅读
  2. PyTorch基础知识讲解(三)自动微分与模型微调

    2024-03-22 12:38:04       51 阅读
  3. 独孤思维:伪造收益图,进行副业收割

    2024-03-22 12:38:04       41 阅读
  4. Android 11系统启动流程

    2024-03-22 12:38:04       41 阅读
  5. DFS进阶——地宫取宝

    2024-03-22 12:38:04       43 阅读
  6. 19.作业

    19.作业

    2024-03-22 12:38:04      35 阅读
  7. Unity中实现游戏对象逐渐放大的脚本教程

    2024-03-22 12:38:04       39 阅读
  8. python修改txt文件指定行内容

    2024-03-22 12:38:04       41 阅读
  9. 模拟输入用户名和密码并登录

    2024-03-22 12:38:04       40 阅读