python | 您所在的位置:网站首页 › 尺寸测量尺子 › python |
首先,利用机器视觉来测定零件尺寸,我们能够直接得到的是图片的像素,要想获得尺寸大小,我们必须找到像素和实际尺寸间的关系。 我们在这里定义一个比例概念:每度量比的像素(pixels per metric ratio)。 近似含义是每个单位指标中包含的像素数。例如,图表上的1厘米包含100张图像。 实际上,相当于引用对象的作用,例如已知地图上的引用材质,我们可以使用此引用对象将其转换为地图上其他对象的大小。 引用对象需要具有两个重要属性: 属性#1:我们应该以可测量的单位(例如毫米,英寸等)知道该对象的尺寸(在宽度或高度方面)。属性#2:我们应该能够在图像中轻松找到这个参考对象,或者根据对象的 位置(例如参考对象总是放在图像的左上角),或者通过外观(如是独特的颜色或形状,独特且与图像中的所有其他物体不同)。在任何一种情况下,我们的参考应该 以某种方式唯一可识别。这里我选择的参照对象是美国硬币(0.9in x 1.0in),单位为英寸,并且保证它一直在照片的最左侧。并使用它来定义 pixel_per_metric,我们定义为: pixels_per_metric = object_width / know_width 现在,假设我们的 object_width(以像素为单位)计算为150像素宽(基于其关联的边界框)。 因此 pixels_per_metric是: pixels_per_metric = 150px / 0.955in = 157px 因此暗示在我们的图像中每0.955英寸大约有157个像素。使用此比率,我们可以计算图像中对象的大小。 然而我们还遇到一个问题是:要想每张照片上都有一个参照对象——美国硬币,这对我们来说是很麻烦的一件事,因为我们在工厂处理大批量的零件时不可能在每个零件旁都放置一枚硬币。因此,我采用了图像混合方法来处理图像,将硬币图片人为混合在零件图片上。 pip install imutils 确保是最新版本 pip install --upgrade imutils 若是Pycharm,可以在setting中编译器里面安装 from scipy.spatial import distance as dist from imutils import perspective from imutils import contours #import argparse import imutils import numpy as np import cv2图像混合处理 coin_img = cv2.imread("standard_object.png") image = cv2.imread("example_03.png") if not image.data: print("read image wrong!") if not coin_img.data: print("read coin_img wrong") imageROI = np.ones((100, 88, 3)) imageROI = coin_img[0:100, 0: 88] image[10:98, 10:98] = imageROI对图像进行预处理 从磁盘加载我们的图像,将其转换为灰度,然后使用高斯滤波器对其进行平滑处理。然后,我们进行边缘检测以及扩张+侵蚀,以封闭边缘图中边缘之间的任何间隙 找到与我们的边缘图中的对象相对应的轮廓(即轮廓) 从左到右(允许我们提取参考对象)对这些轮廓进行排序 。 初始化 pixelPerMetric 值 # load the image, convert it to grayscale, and blur it slightly gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (7, 7), 0) # perform edge detection, then perform a dilation + erosion to # close gaps in between object edges edged = cv2.Canny(gray, 50, 100) edged = cv2.dilate(edged, None, iterations=1) edged = cv2.erode(edged, None, iterations=1) # find contours in the edge map cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # sort the contours from left-to-right and initialize the # 'pixels per metric' calibration variable (cnts, _) = contours.sort_contours(cnts) pixelsPerMetric = None width = 3.5检查每一个轮廓 我们开始在每个轮廓上循环。如果轮廓不够大,我们丢弃该区域,假设它是边缘检测过程遗留的噪声 如果轮廓区域足够大,我们计算图像的旋转边界框 然后,我们将旋转的边界框坐标排列在左上角,右上角,右下角和左下角 最后, 以绿色绘制对象的轮廓,然后以小的红色圆圈绘制边界框矩形的顶点。 # loop over the contours individually for c in cnts: # if the contour is not sufficiently large, ignore it if cv2.contourArea(c) |
CopyRight 2018-2019 实验室设备网 版权所有 |