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 21:42:24 浏览: 107
在绘制轮廓时,由于绘制的线条宽度为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是折线的长度。
相关问题
import cv2 import glob import numpy as np imgs = glob.glob("maze.png") res, L, N = [], 256, 5 for i in imgs: img = cv2.imread(i) img = cv2.resize(img, (512, 512)) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) max_contour = max(contours, key=cv2.contourArea) epsilon = 0.1 * cv2.arcLength(max_contour, True) approx = cv2.approxPolyDP(max_contour, epsilon, True) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=15, minRadius=5, maxRadius=15) if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(img, (x, y), r, (0, 0, 255), 2) # edges = cv2.Canny(gray, 100, 200) contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: center, (width, height), angle = cv2.minAreaRect(contour) if -5 <= (width - height) <= 5 and 30 <= width <= 50: cv2.drawContours(img, [contour], -1, (0, 0, 255), 3) res.append(cv2.resize(img, (L, L))) resImg = np.zeros((L * N, L * N, 3), dtype=np.uint8) for i, img in enumerate(res): row, col = i // N, i % N x, y = col * L, row * L resImg[y:y + L, x:x + L] = img cv2.imshow("", resImg) cv2.waitKey(0) cv2.destroyAllWindows()
这是一段Python代码,主要的作用是对给定的maze.png图片进行处理并展示处理后的结果。具体包括以下步骤:
1. 导入cv2、glob和numpy模块。
2. 使用glob模块获取maze.png图片的路径,将其读取并调整大小为512x512。
3. 将图片转化为灰度图,并进行二值化处理。
4. 使用cv2.findContours函数找到图像中的所有轮廓,并选择面积最大的轮廓进行逼近处理。
5. 使用cv2.HoughCircles函数检测图像中的圆形,并在圆形周围画出红色圆圈。
6. 使用cv2.Canny函数进行边缘检测,再次使用cv2.findContours函数找到图像中的所有轮廓。
7. 对于每个轮廓,使用cv2.minAreaRect函数获取其最小外接矩形,并判断其长宽比是否在一定范围内,如果满足条件,则在轮廓周围画出红色矩形。
8. 将处理后的图片添加进一个列表中,并将所有图片通过numpy模块拼接成一个大图展示。
以上就是这段代码的大致执行过程。
阅读全文