mask = np.zeros(img.shape,img.dtype) epsilon = 0.01 * cv2.arcLength(outer_contours[max_index], False) approx = cv2.approxPolyDP(outer_contours[max_index], epsilon, True) color = (255,255,255) cv2.drawContours(mask, approx, -1, color, 3) 为什么在mask 以及img上表现为直线两端的一个圆点 但实际上轮廓为一条较粗的直线 如何才能绘制出沿着这条直线的上的点 因为要计算该直线的长度 轮廓实际长度为96.5535 但使用cv2.arcLength测得轮廓长度为184.0
时间: 2024-03-13 12:42:24 浏览: 30
在绘制轮廓时,由于绘制的线条宽度为3,所以会在轮廓两端留下一个圆角。
如果你想沿着这条直线绘制点,你可以使用cv2.line()函数绘制直线,然后在直线上均匀地采样一些点。cv2.line()函数的用法如下:
```
cv2.line(img, pt1, pt2, color, thickness)
```
其中img表示要绘制直线的图像,pt1和pt2表示直线的起点和终点坐标,color表示直线的颜色,thickness表示直线的宽度。
为了计算轮廓的长度,你可以使用cv2.arcLength()函数。不过需要注意的是,cv2.arcLength()函数计算的是轮廓的周长,而不是长度。如果你要计算轮廓的长度,可以将轮廓转换为一条折线,然后计算折线的长度。具体实现方法如下:
```
epsilon = 0.01 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
length = 0
for i in range(1, len(approx)):
length += np.sqrt((approx[i][0][0] - approx[i-1][0][0])**2 + (approx[i][0][1] - approx[i-1][0][1])**2)
```
其中,epsilon是多边形近似的精度,可以根据需要调整。approx是近似后的轮廓,length是折线的长度。
相关问题
mask = np.zeros(img.shape,img.dtype) epsilon = 0.01 * cv2.arcLength(outer_contours[max_index], False) approx = cv2.approxPolyDP(outer_contours[max_index], epsilon, True) color = (255,255,255) cv2.drawContours(mask, approx, -1, color, 6) 为什么在mask 以及img上表现为两个圆点 但轮廓为一条较粗的直线
根据提供的代码,我猜测您正在进行图像分割的任务,使用的是OpenCV库中的cv2.drawContours()函数对轮廓进行绘制。
在这段代码中,首先创建了一个与原始图像大小相同的mask图像,然后使用cv2.approxPolyDP()函数对外部轮廓进行多边形近似,生成一个新的轮廓。最后,使用cv2.drawContours()函数将近似的轮廓绘制在mask图像上。
由于绘制轮廓时将线条宽度设置为了6,所以在mask图像上绘制的轮廓较为粗厚,可能会覆盖多个像素。在图像可视化过程中,可能会表现为两个圆点,因为可能是mask图像上的两个像素重叠在一起,在二值化后就成为了一个白色的圆点。
而对于原始图像img,因为没有进行二值化处理,所以绘制的轮廓线条并不是纯白色的,而是包含了原始图像的颜色信息。因此,绘制的轮廓线条在img上表现为一条较粗的直线。
bin_img = np.zeros(shape=timg.shape, dtype=np.uint8)
这段代码的作用是创建一个与`timg`具有相同形状和数据类型的全零数组`bin_img`。`shape`参数指定了数组的形状,`dtype`参数指定了数组元素的数据类型。在这里,`np.uint8`表示无符号8位整数,即像素值范围在0到255之间。通常,这个数组会被用来存储二值化后的图像,其中像素值为0或255。