边缘直线异常检测

 


摘要

塑封包装的纸盒在边界处有破损或者翘起等现象需检测为不良品


一、待检测图像

直线边缘有塑封膜的翘起, 如红色框图所示, 正常如绿色所示, 边界处是一根直线, 没有翘起

二、检测步骤

1.图像锐化

如何对边界进行锐化, 将异常塑封膜进行特征突出显示, 可构建不同方向的filter滤波核, 进而不同权值的叠加

//1. 单通道的grayImg
cv::Mat grayImg;
getGrayImg(srcImg, grayImg);

//2. 在竖直方向的filter2d
cv::Mat vertMat;
cv::filter2D(grayImg, vertMat, grayImg.depth(), vertKernel);
cv::convertScaleAbs(vertMat, vertMat);
//3. 在顺45方向的filter2d
cv::Mat vert45Mat;
cv::filter2D(grayImg, vert45Mat, grayImg.depth(), KernelBl);
cv::convertScaleAbs(vert45Mat, vert45Mat);

//4. 在逆45方向的filter2d
cv::Mat vertAn45Mat;
cv::filter2D(grayImg, vertAn45Mat, grayImg.depth(), KernelBr);
cv::convertScaleAbs(vertAn45Mat, vertAn45Mat);

//5. 各个方向锐化的相加
cv::Mat filterImg;
cv::addWeighted(vertMat, 0.5, vert45Mat, 0.5, 0, filterImg);
cv::addWeighted(filterImg, 0.5, vertAn45Mat, 0.5, 0, resFilterImg);

2.锐化原图

3.直线检测

锐化的图像类似直线, 可进行直线的拟合进行特征的检测。

3.1 霍夫直线

空间坐标系到极坐标的转化如下, 这个点在极坐标下对应的(ρ,θ)画出来一个周期是如下所示,以θ为x轴

A: 将参数空间(ρ,θ)量化,赋初值一个二维矩阵M,M(ρ,θ)就是一个累加器了;

B: 每一个点进行变换,变换到属于哪一组(ρ,θ),就把该组(ρ,θ)对应的累加器数加;

C: 分析得到的M(ρ,θ),设置一个阈值T,认为当M(ρ,θ)>T,就认为存在一条有意义的直线存在;

3.2 起始点的拟合直线

在横轴方向, 遍历第一个非零像素的y坐标, 进行直线的拟合直线的采用fitline函数, 具体实现如下

std::vector<cv::Point> indexPoints
for (size_t index = 0; index < size_t(pointsNum); index++) {
    startX = int(index *gapStep);
    noneZeroColLength = cv::countNonZero(srcImg.col(startX));

    if (noneZeroColLength == 0) {
        continue;
    }
    
    if (noneZeroColLength > lineFeatureParam.fristPixIndex) {
        cv::findNonZero(srcImg.col(startX), noneLinePoints);
        startColPoint = cv::Point(startX, noneLinePoints[lineFeatureParam.fristPixIndex].y);
        indexPoints.push_back(startColPoint);
    }
}

3.3 最小二乘法直线拟合

找到一条直线,使得所有已知的点到这条直线的欧式距离的和最下, y = k*x +b

 

3.4 直线特征分析

检测直线的斜率 偏移的像素点 左右位置的偏移 中间非零的像素数

/*锐化单根线的check*/
message LinePointCheck {
required float line_num = 1; //检测点的ration,如100的长度,check其中50个点
required float line_zero = 2; //检测零的ration,如100的长度,check其中50个点
required int32 line_gap = 3;
required float line_abnorm = 4; //在line_num的基础上,异常的概率
optional float line_k_ration = 5;
optional EspicalSlopeRation esp_k_ration_param = 6;
optional EspicalLineStraighDelta esp_straigh_param = 7; //相对的变化
}

总结

1. 如何进行锐化, 突出异常区域是关键

2. 采用第index个非零的点, 进行直线的拟合

3. 直线特征的检测


 

Halcon边缘检测拟合直线求角度的方法是通过寻找产品的边缘点,然后根据这些边缘点拟合直线,最后计算出产品的偏移角度。这个方法可以使用Halcon中的fit_line_contour_xld函数来实现。该函数可以将一个XLD轮廓拟合成一条线段,并获取线段的起始点坐标以及直线法线式方程中的Nr和Nc向量。通过这些参数,可以计算出直线的角度。这个方法在工业检测中有很大的应用价值,可以用于精细寻找产品的边界并计算角度,也可以用于拟合两条边并求交点进行定位,还可以用于求解参与拟合的点到直线的距离,进行异常值检测。如果需要将整个算法进行封装,可以使用Halcon中的MS_FitRectangle函数来实现。该函数可以将整个算法进行封装,方便调用和使用。 #### 引用[.reference_title] - *1* *2* [Halcon 直线拟合fit_line_contour_xld详解](https://blog.csdn.net/qq_18620653/article/details/121156147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[Halcon&拟合] 直线、矩形和圆的边缘提取](https://blog.csdn.net/weixin_43197380/article/details/122194051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值