Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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 使用OpenCV从图像中提取轮廓_Python_Opencv - Fatal编程技术网

Python 使用OpenCV从图像中提取轮廓

Python 使用OpenCV从图像中提取轮廓,python,opencv,Python,Opencv,我有一张图片,几条交叉线产生了四个多边形。我想测量每个多边形的面积。在我的脚本中,我试图创建轮廓,可能使用了错误的方法。我很感激你的建议。。。 进口cv2 将numpy作为np导入 导入时间 定义HSV中的颜色范围 下_red=np.数组[150135160] 上部红色=np.数组[180250200] 白线=np.数组[255255] 红线=np.数组[0,0255] im=cv2.imread'laser.jpg' imgray=cv2.cvt颜色,cv2.COLOR\u bgr2灰色 cv

我有一张图片,几条交叉线产生了四个多边形。我想测量每个多边形的面积。在我的脚本中,我试图创建轮廓,可能使用了错误的方法。我很感激你的建议。。。 进口cv2 将numpy作为np导入 导入时间 定义HSV中的颜色范围 下_red=np.数组[150135160] 上部红色=np.数组[180250200] 白线=np.数组[255255] 红线=np.数组[0,0255] im=cv2.imread'laser.jpg' imgray=cv2.cvt颜色,cv2.COLOR\u bgr2灰色 cv2.imshow'imgray',im ret,Threshold=cv2。thresholdimgray,127255,0 cv2.imshow'thresh',thresh 消除一些小噪音(如有)。 扩张=cv2。扩张阈值,无 侵蚀=cv2。侵蚀膨胀,无 cv2.显示“侵蚀”,侵蚀 _,轮廓,层次=cv2.findContourserode,cv2.RETR\u外部,cv2.CHAIN\u近似\u SIMPLE 对于等高线中的等高线: 如果cv2.ContourArea Contourt>50: 打印轮廓 im2=np.Zeros500500,3,np.uint8 cv2.drawContoursim2,contours,0125125,0,1 cv2.im2显示“轮廓”,im2 k=cv2.0 如果k==27:等待ESC键退出 cv2.1所有窗口 elif k==ord's':等待's'键保存并退出 cv2.imwrite'mesicgray.png',im2
cv2.destroyAllWindows要使用当前代码提取轮廓,可以执行以下操作:

_,contours,heirarchy=cv2.findContours(erode,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
im2 =  np.zeros((480,640,3), np.uint8)
cv2.drawContours(im2,contours,-1,(125,125,0),1)
使用RETR_EXTERNAL将仅为您提供外部零件的边界,如果内部有任何单独零件,则这些零件将被排除在外,因此只需使用RETR_TREE,它将提供适当的继承权,以便您知道您正在查看内部边界。 您创建的空阵列im2的大小不正确,为500500,因为这样做会排除图像的某些部分,在绘制此区域以外的轮廓时会出现错误。这些都是小错误

现在,对于错误的主要部分是cv2,DrawContoursM2,contours,0125125,0,1,这里你给出了图像中轮廓的数组,并告诉它只绘制第一个轮廓,通过第0个元素;所以你应该做的是使用轮廓编号1或2或3或4或。。。代替0或先选择轮廓,然后按如下方式绘制:

cnt=contour[4]
cv2.drawContours(im2,[cnt],0,(125,125,0),1)
cnt=[contour[2],contour[5],contour[9]]
cv2.drawContours(im2,cnt,-1,(125,125,0),1)
或者只需提供-1而不是像我前面所示的0来绘制所有轮廓

如果要选择一些轮廓并绘制它们,可以执行以下操作:

cnt=contour[4]
cv2.drawContours(im2,[cnt],0,(125,125,0),1)
cnt=[contour[2],contour[5],contour[9]]
cv2.drawContours(im2,cnt,-1,(125,125,0),1)

我的回答解决了你的问题吗?非常感谢,我不是谷歌!你的辩护解决了我的主要问题,我现在可以更进一步了。我的最终目标是围绕图像中心的四个矩形构建轮廓,并计算面积。在您输入后,我发现我必须反转图片构建负片并应用findContour函数。@guslik基本findContour的轮廓与您正在搜索的精确线条相比仍然不清楚,您可以尝试在查找轮廓或检查所需的特定形状之前应用过滤器来检测线性边。或者使用包含要检测的生成多边形的图像训练opencv。您需要对具有分离线边的多边形执行某些操作。如果我能提供任何帮助,请告诉我谢谢你,我会感谢你的帮助。。。我想,在图像上找到多边形轮廓可以为我提供精确的面积值。我不知道这种方法有多准确,但我想试试。面积测量是一个主要目标,如果其他方法适用且更简单或更好,我很乐意学习。。。