Python 如何识别与我的对象关联的轮廓并找到它们的几何质心
问题陈述和背景信息: 编辑:约束条件:法兰上的红色颜色会随着时间的推移而变化,因此我现在不会尝试使用颜色识别来识别我的对象,除非它可以很坚固。此外,ally外部照明可能是一个因素,因为这将在未来的室外区域 我有RGB深度相机,有了它,我可以捕捉这个场景。其中,每个像素(x,y)都有一个深度值 对与我的图像相关联的深度贴图应用梯度幅度过滤器,我能够得到下面的边缘贴图 如果梯度震级的震级不为零,则其值为0。黑色(255)表示与0(均匀深度或平面)关联的幅值 从这张边缘地图上,我拨动了边缘,这样拾取轮廓就更容易了。 然后我在图像中找到了轮廓,并试图绘制出5个最大的轮廓 问题 有没有办法可靠地找到与我的对象(红色框和金属夹具)关联的轮廓,然后找到它们的几何质心?我一直遇到这样一个问题,我可以在图像中找到轮廓,但我没有办法选择性地筛选我的对象而不是噪声的轮廓 我已经提供了用于图像处理的图像,但出于某种原因,OpenCV将图像保存为黑色图像,,当您使用Python 如何识别与我的对象关联的轮廓并找到它们的几何质心,python,opencv,image-processing,computer-vision,object-recognition,Python,Opencv,Image Processing,Computer Vision,Object Recognition,问题陈述和背景信息: 编辑:约束条件:法兰上的红色颜色会随着时间的推移而变化,因此我现在不会尝试使用颜色识别来识别我的对象,除非它可以很坚固。此外,ally外部照明可能是一个因素,因为这将在未来的室外区域 我有RGB深度相机,有了它,我可以捕捉这个场景。其中,每个像素(x,y)都有一个深度值 对与我的图像相关联的深度贴图应用梯度幅度过滤器,我能够得到下面的边缘贴图 如果梯度震级的震级不为零,则其值为0。黑色(255)表示与0(均匀深度或平面)关联的幅值 从这张边缘地图上,我拨动了边缘,这样拾
gray = cv2.imread('GRAYTEST.jpeg', cv2.IMREAD_GRAYSCALE)
它看起来略带蓝色,而不是我所展示的黑白二值图像。非常抱歉
图为:
抱歉,我不知道为什么它只保存为黑色图像,但如果您在OpenCV中阅读它,它应该显示与“渐变幅度”绘图相同的线条
我的代码
gray = cv2.imread('GRAYTEST.jpeg', cv2.IMREAD_GRAYSCALE)
plt.imshow(gray)
plt.title('gray start image')
plt.show()
blurred = cv2.bilateralFilter(gray, 8, 25, 25) # blurr image while preserving edges
kernel = np.ones((3, 3), np.uint8) # define a kernel (block) to apply filters to
dialated = cv2.dilate(blurred, kernel, iterations=1)
plt.title('dialated')
plt.imshow(dialated)
plt.show()
#Just performs a canny edge dectection on an image
edges_empty = self.Commons.CannyE_Auto(dialated) # Canny edge image for some sigma
#makes an empty image using the same diemensions of the given image
empty2 = self.Commons.make_empty(gray)
_, contours, _ = cv2.findContours(edges_empty, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(contours, key=cv2.contourArea, reverse=True)[:5] # get largest five contour area
cv2.drawContours(empty2, cnts, -1, (255, 0, 0), thickness=1)
plt.title('contours')
plt.imshow(empty2)
plt.show()
for c in cnts:
# compute the center of the contour
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# draw the contour and center of the shape on the image
cv2.drawContours(empty2, [c], -1, (255, 0, 0), thickness=1)
perimeter = np.around(cv2.arcLength(c, True), decimals=3)
area = np.around(cv2.contourArea(c), decimals=3)
cv2.circle(empty2, (cX, cY), 7, (255, 255, 255), -1)
cv2.putText(empty2, "center", (cX - 20, cY - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
cv2.putText(empty2, "P:{}".format(perimeter), (cX - 50, cY - 50),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
cv2.putText(empty2, "A:{}".format(area), (cX - 100, cY - 100),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
使用上面的代码,我能够标记每个轮廓的质心以及关于每个轮廓周长和面积的信息
但是,我无法执行一个测试,以选择哪个轮廓是我想要的轮廓。我有一个想法,在一个更理想的环境中捕捉我的对象,并找到它的质心、周长和相关区域。这样,当我找到一个新的轮廓时,我可以将它与我已知的值进行比较
我认为这种方法可以去除太大或太小的轮廓
如果有人知道更好的解决方案,那就太棒了 为什么不使用颜色阈值来查找红色像素?当检测到这样一个颜色均匀的区域时,不需要边缘和轮廓。我的缺点是法兰上的红色是可变的。它会随着时间的推移而磨损,所以我试图仅使用几何体和形状信息来查找我的图像。我将在我的描述中包括这一点。