cv2.fillPoly(mask, [np.int32(circle)], 0) TypeError: pts is not a numpy array, neither a scalar
时间: 2024-03-05 09:52:46 浏览: 62
这个错误通常是由于`pts`参数不是正确的`numpy`数组引起的。`cv2.fillPoly()`函数需要的`pts`参数应该是一个`numpy`数组列表,表示要填充的多边形区域。每个多边形应该表示为一个数组,其中每一行都是多边形中的一个点的坐标。
你可以尝试使用以下代码,将`circle`转换为一个数组,再将其传递给`cv2.fillPoly()`函数:
```python
# 填充圆形区域
mask = np.zeros_like(img)
for circle in circles[0]:
circle = np.int32(circle)
pts = cv2.ellipse2Poly((circle[0], circle[1]), (circle[2], circle[2]), 0, 0, 360, 10)
cv2.fillPoly(mask, [pts], 0)
```
在这个代码中,我们首先将`circle`转换为`numpy`整型数组,然后使用`cv2.ellipse2Poly()`函数计算圆形的多边形表示形式。最后,我们将多边形传递给`cv2.fillPoly()`函数。
希望这可以解决你的问题!
相关问题
cv2.fillPoly报错img is not a numpy array, neither a scalar
`cv2.fillPoly` 是 OpenCV 库中的一个函数,用于填充给定的多边形区域。在调用 `cv2.fillPoly` 函数时,如果遇到了 `img is not a numpy array, neither a scalar` 的错误,这通常意味着提供的 `img` 参数既不是 NumPy 数组也不是标量值。
为了解决这个问题,你需要确保传入的 `img` 参数是一个正确形状和数据类型的 NumPy 数组。以下是几个可能的解决方案:
1. 检查 `img` 是否已经被正确初始化为一个 NumPy 数组。如果 `img` 应该是一个图像,那么你需要使用如 `cv2.imread` 或者 `np.zeros` 等函数创建一个图像数组。
2. 确保 `img` 没有在其他地方被修改,导致其不再是 NumPy 数组。
3. 如果 `img` 是一个变量,它在之前的操作中可能被覆盖了,需要检查代码中的所有相关部分,确认变量类型。
示例代码:
```python
import cv2
import numpy as np
# 创建一个空白图像数组,用于填充多边形
img = np.zeros((512, 512, 3), dtype=np.uint8)
# 定义多边形的顶点坐标
points = np.array([[100, 100], [200, 100], [150, 200]])
# 使用cv2.fillPoly填充多边形
cv2.fillPoly(img, [points], (255, 255, 255))
# 显示图像
cv2.imshow('Filled Polygon', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这段代码中,`img` 是一个512x512大小的三通道黑色图像,我们可以在这个图像上使用 `cv2.fillPoly` 来填充一个多边形。
while cap.isOpened(): ret, frame = cap.read() if ret: # 在视频帧上画线 frame = cv2.line(frame, start_point, end_point, color, thickness) mask = np.zeros(frame.shape[:2], dtype=np.uint8) # 定义多边形顶点 pts = np.array([[0, 480], [1920, 650], [1920, 1080], [0, 1080]], dtype=np.int32) # 填充多边形 cv2.fillPoly(mask, [pts], 255) # 进行按位与操作 result = cv2.bitwise_and(frame, frame, mask=mask) # 显示视频帧 cv2.imshow('frame', result) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break else: break 求改为取图片上半部分
以下是改为取图片上半部分的代码:
``` python
img = cv2.imread("image.jpg")
# 取图片上半部分
height, width = img.shape[:2]
roi = img[0:int(height/2), 0:width]
cv2.imshow('image', roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
首先读取图片,然后使用切片操作取图片上半部分,即前一半的行数和所有的列数,存储在变量roi中。最后显示roi即可。
阅读全文