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); // 在输出窗口中显示结果图像
}

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值