Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何识别与我的对象关联的轮廓并找到它们的几何质心_Python_Opencv_Image Processing_Computer Vision_Object Recognition - Fatal编程技术网

Python 如何识别与我的对象关联的轮廓并找到它们的几何质心

Python 如何识别与我的对象关联的轮廓并找到它们的几何质心,python,opencv,image-processing,computer-vision,object-recognition,Python,Opencv,Image Processing,Computer Vision,Object Recognition,问题陈述和背景信息: 编辑:约束条件:法兰上的红色颜色会随着时间的推移而变化,因此我现在不会尝试使用颜色识别来识别我的对象,除非它可以很坚固。此外,ally外部照明可能是一个因素,因为这将在未来的室外区域 我有RGB深度相机,有了它,我可以捕捉这个场景。其中,每个像素(x,y)都有一个深度值 对与我的图像相关联的深度贴图应用梯度幅度过滤器,我能够得到下面的边缘贴图 如果梯度震级的震级不为零,则其值为0。黑色(255)表示与0(均匀深度或平面)关联的幅值 从这张边缘地图上,我拨动了边缘,这样拾

问题陈述和背景信息:

编辑:约束条件:法兰上的红色颜色会随着时间的推移而变化,因此我现在不会尝试使用颜色识别来识别我的对象,除非它可以很坚固。此外,ally外部照明可能是一个因素,因为这将在未来的室外区域

我有RGB深度相机,有了它,我可以捕捉这个场景。其中,每个像素(x,y)都有一个深度值

对与我的图像相关联的深度贴图应用梯度幅度过滤器,我能够得到下面的边缘贴图

如果梯度震级的震级不为零,则其值为0。黑色(255)表示与0(均匀深度或平面)关联的幅值

从这张边缘地图上,我拨动了边缘,这样拾取轮廓就更容易了。

然后我在图像中找到了轮廓,并试图绘制出5个最大的轮廓

问题

有没有办法可靠地找到与我的对象(红色框和金属夹具)关联的轮廓,然后找到它们的几何质心?我一直遇到这样一个问题,我可以在图像中找到轮廓,但我没有办法选择性地筛选我的对象而不是噪声的轮廓

我已经提供了用于图像处理的图像,但出于某种原因,OpenCV将图像保存为黑色图像,,当您使用

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()
  • 我没有对已经阈值化的图像执行模糊操作、拨号、canny边缘检测,而是对原始图像执行轮廓检测

  • 然后,通过修改findContour命令,我能够为我的图像的轮廓找到一个合适的轮廓

    _,轮廓,u=cv2.Find轮廓(灰色,cv2.RETR_外部,cv2.CHAIN_近似无)

  • 将cv2.RETR_树替换为cv2.RETR_EXTERNAL我只能获得与对象轮廓相关联的轮廓,而不是尝试获取对象内的轮廓。切换到cv2.CHAIN_Abrox_NONE没有显示出任何明显的改进,但它可以为更复杂的几何图形提供更好的轮廓

            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)
    
    使用上面的代码,我能够标记每个轮廓的质心以及关于每个轮廓周长和面积的信息

    但是,我无法执行一个测试,以选择哪个轮廓是我想要的轮廓。我有一个想法,在一个更理想的环境中捕捉我的对象,并找到它的质心、周长和相关区域。这样,当我找到一个新的轮廓时,我可以将它与我已知的值进行比较

    我认为这种方法可以去除太大或太小的轮廓


    如果有人知道更好的解决方案,那就太棒了

    为什么不使用颜色阈值来查找红色像素?当检测到这样一个颜色均匀的区域时,不需要边缘和轮廓。我的缺点是法兰上的红色是可变的。它会随着时间的推移而磨损,所以我试图仅使用几何体和形状信息来查找我的图像。我将在我的描述中包括这一点。