Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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_Contour_Cv2 - Fatal编程技术网

Python绘制多个特定元素的轮廓

Python绘制多个特定元素的轮廓,python,contour,cv2,Python,Contour,Cv2,我有一个二值图像,我试图对延长的元素(不是圆)进行轮廓处理。 如果我试图勾勒出一个元素的轮廓,它就会勾勒出正确的颜色。但是当我有一个for循环时,怎么做呢?它仅显示具有正确颜色的最后一个元素。 这是我的密码: 输入数学 for i in range(len(contours)): ctr = contours[i] M = cv2.moments(ctr) cX = M['m10']/M['m00'] cY = M['m01']/M['m00']

我有一个二值图像,我试图对延长的元素(不是圆)进行轮廓处理。 如果我试图勾勒出一个元素的轮廓,它就会勾勒出正确的颜色。但是当我有一个for循环时,怎么做呢?它仅显示具有正确颜色的最后一个元素。 这是我的密码: 输入数学

for i in range(len(contours)):
    ctr = contours[i] 
    M = cv2.moments(ctr)
    cX = M['m10']/M['m00']
    cY = M['m01']/M['m00']
    
    rgb = cv2.cvtColor(img_mask, cv2.COLOR_GRAY2RGB)
    cv2.drawContours(rgb, contours, i, (255, 0, 0), 2)
    rot_rect = cv2.minAreaRect(ctr)
    box = np.int64(cv2.boxPoints(rot_rect))

    xx1=(box[0,0]+box[1,0])/2
    yy1=(box[0,1]+box[1,1])/2
    xx2=(box[2,0]+box[1,0])/2
    yy2=(box[2,1]+box[1,1])/2

    distance1 = math.sqrt( ((xx1-cX)**2)+((yy1-cY)**2) )
    distance2 = math.sqrt( ((xx2-cX)**2)+((yy2-cY)**2) )
    
    if (distance1 < 0.5*distance2) or (0.5*distance1 > distance2):
        cv2.drawContours(rgb, [box], -1, (0, 255, 0), 2)
        plt.imshow(rgb)
    else:
        cv2.drawContours(rgb, [box], -1, (0, 0, 255), 2)
        plt.imshow(rgb)
适用于范围内的i(透镜(轮廓)):
ctr=等高线[i]
M=cv2.力矩(ctr)
cX=M['m10']/M['m00']
cY=M['m01']/M['m00']
rgb=cv2.CVT颜色(img_掩码,cv2.COLOR_GRAY2RGB)
cv2.绘制等高线(rgb,等高线,i,(255,0,0),2)
rot_rect=cv2.Minareact(ctr)
box=np.int64(cv2.boxPoints(rot_rect))
xx1=(框[0,0]+框[1,0])/2
yy1=(框[0,1]+框[1,1])/2
xx2=(框[2,0]+框[1,0])/2
yy2=(框[2,1]+框[1,1])/2
距离1=数学sqrt((xx1 cX)**2)+(yy1 cY)**2))
距离2=数学sqrt((xx2 cX)**2)+(yy2 cY)**2))
如果(距离1<0.5*距离2)或(0.5*距离1>距离2):
cv2.绘制等高线(rgb,[box],-1,(0,255,0),2)
plt.imshow(rgb)
其他:
cv2.绘制轮廓(rgb,[box],-1,(0,0,255),2)
plt.imshow(rgb)

这对我很有帮助。我将相关轮廓保存到相关阵列(请注意,它们必须是阵列而不是列表,以便我们可以在轮廓绘制方法中使用它们)。

导入数学
ctr1=[]
ctr2=[]
对于范围内的i(透镜(轮廓)):
ctr=等高线[i]
M=cv2.力矩(ctr)
cX=M['m10']/M['m00']
cY=M['m01']/M['m00']
rgb=cv2.CVT颜色(img_掩码,cv2.COLOR_GRAY2RGB)
rot_rect=cv2.Minareact(ctr)
box=np.int64(cv2.boxPoints(rot_rect))
xx1=(框[0,0]+框[1,0])/2
yy1=(框[0,1]+框[1,1])/2
xx2=(框[2,0]+框[1,0])/2
yy2=(框[2,1]+框[1,1])/2
距离1=数学sqrt((xx1 cX)**2)+(yy1 cY)**2))
距离2=数学sqrt((xx2 cX)**2)+(yy2 cY)**2))
如果(距离1<0.5*距离2)或(0.5*距离1>距离2):
ctr1.append(np.asarray(ctr,dtype=np.int32))
其他:
ctr2.append(np.asarray(ctr,dtype=np.int32))
cv2.等高线图(rgb,ctr1,-1,(255,0,0),5)
cv2.等高线图(rgb,ctr2,-1,(0,255,0),2)
import math
ctr1= []
ctr2= []
for i in range(len(contours)):
    ctr = contours[i] 
    M = cv2.moments(ctr)
    cX = M['m10']/M['m00']
    cY = M['m01']/M['m00']
    
    rgb = cv2.cvtColor(img_mask, cv2.COLOR_GRAY2RGB)
    rot_rect = cv2.minAreaRect(ctr)
    box = np.int64(cv2.boxPoints(rot_rect))

    xx1=(box[0,0]+box[1,0])/2
    yy1=(box[0,1]+box[1,1])/2
    xx2=(box[2,0]+box[1,0])/2
    yy2=(box[2,1]+box[1,1])/2

    distance1 = math.sqrt( ((xx1-cX)**2)+((yy1-cY)**2) )
    distance2 = math.sqrt( ((xx2-cX)**2)+((yy2-cY)**2) )
    
    if (distance1 < 0.5*distance2) or (0.5*distance1 > distance2):
        ctr1.append(np.asarray(ctr, dtype=np.int32))
    else:
        ctr2.append(np.asarray(ctr, dtype=np.int32))

cv2.drawContours(rgb, ctr1, -1, (255, 0, 0),5)
cv2.drawContours(rgb, ctr2, -1, (0, 255, 0),2)