摘要
塑封包装的纸盒在边界处有破损或者翘起等现象,需检测为不良品。
一、待检测图像
直线边缘有塑封膜的翘起, 如红色框图所示, 正常如绿色所示, 边界处是一根直线, 没有翘起。
二、检测步骤
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. 直线特征的检测