【opencv distanceTransform 缺陷检测】

文章目录


void cv::distanceTransform(
    InputArray src, 
    OutputArray dst, 
    int distanceType, 
    int maskSize, 
    int dstType = CV_32F);

在这里插入图片描述

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

int main() {
    // 读取图像
    cv::Mat o = cv::imread("pill.png", cv::IMREAD_GRAYSCALE);
    if (o.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 二值化处理
    cv::Mat binary;
    cv::threshold(o, binary, 0, 255, cv::THRESH_BINARY + cv::THRESH_OTSU);

    // 形态学开运算
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat op;
    cv::morphologyEx(binary, op, cv::MORPH_OPEN, kernel, cv::Point(-1, -1), 1);

    // 距离变换
    cv::Mat dist_transform;
    cv::distanceTransform(op, dist_transform, cv::DIST_L2, 3);
    cv::normalize(dist_transform, dist_transform, 0, 1.0, cv::NORM_MINMAX);

    // 阈值处理
    cv::Mat fore, fore_res;
    cv::threshold(dist_transform, fore, 0.3, 1.0, cv::THRESH_BINARY);
    fore.convertTo(fore, CV_8U);
    fore_res = fore * 255;
    // 形态学去噪
    cv::Mat kernel2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
    cv::Mat op2, op2_res;
    cv::morphologyEx(fore, op2, cv::MORPH_OPEN, kernel2, cv::Point(-1, -1), 1);
    op2_res = op2 * 255;

    // 提取轮廓
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(op2, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

    cv::Mat res(o);

    cv::drawContours(res, contours, -1, 255);
    // 缺陷检测
    int count = 0;
    cv::Mat img = o.clone();
    for (size_t i = 0; i < contours.size(); i++) {
        cv::Point2f center;
        float radius;
        cv::minEnclosingCircle(contours[i], center, radius);

        double area = cv::contourArea(contours[i]);
        double area_circle = 3.14 * radius * radius;
        if (area / area_circle >= 0.5) {
            cv::putText(img, "OK", center, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255), 2);
        }
        else {
            cv::putText(img, "bad", center, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255), 2);
        }
        count++;
    }
    cv::putText(img, "sum=" + std::to_string(count), cv::Point(20, 30), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255));

    // 显示结果
    cv::imshow("result", img);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值