我正在使用 opencv 测量垫圈尺寸以进行分类。但是 OpenCV 不够精确,这就是我想将代码从 OpenCV 迁移到 DIPlib 的原因。使用以下代码,我正在测量以下标准:
外径、孔径、偏心、毛刺
如何使用 DIPlib 找到这些标准?
这是一个示例图像:
这是衡量上述标准的 OpenCV 代码:
blur(openCvImage, openCvImage, Size(3, 3));
threshold(openCvImage, thresh_output, parameter.thresh1, parameter.thresh1 * 3, THRESH_BINARY_INV);
findContours(thresh_output, contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE);
cvtColor(openCvImage, openCvImage, COLOR_GRAY2RGB);
if (contours.size() == 2)
{
vector<Moments> mu(contours.size());//contours
vector<Point2f> mc(contours.size());//centroid
vector<RotatedRect> minRect(contours.size());//min rectangle
// draw contours and draw point centers of inner and outter circles and find inner and outer perimeter
for (int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], false);// get the moments
mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);// get the centroid of figures.
drawContours(openCvImage, contours, i, color, 2, 8, hierarchy, 0, Point());//draw contours
circle(openCvImage, mc[i], 2, color, -1, 8, 0);//Draw point centroid of the circles
minRect[i] = minAreaRect(contours[i]);//find min fitted rectangle to circles
diameter[i] = arcLength(contours[i], 1) / (M_PI);//find diameter of the washer and washer hole(R=perimeter/pi)
if (minRect[i].size.width < minRect[i].size.height) { swap(minRect[i].size.width, minRect[i].size.height); }//sort the values
//a=shortest diameter b=longest diameter sqrt(b2-a2)/b if b=a equation=0 if a goes to 0 equation=1 eliptic is between 0 an 1 (*100)
eliptic[i] = ((sqrt(pow((minRect[i].size.width / 2), 2) - pow((minRect[i].size.height / 2), 2))) / (minRect[i].size.width / 2)) * 100;
}
burrdistance = pointPolygonTest(contours[0], mc[0], 1);//find the distance from centroid to burr
eccentricity = norm(mc[0] - mc[1]);//find the distance between centroid of the circles
circle(openCvImage, mc[0], burrdistance, (0, 255, 0), 1, 8, 0);//making circle from centroid to burr
burrpercentage = ((diameter[0] / 2) - burrdistance) / (diameter[0] / 2) * 100;//(radius-burrdistance)/radius)
}