python cv 在图片上绘制不规则图形
时间: 2023-12-22 09:04:29 浏览: 196
要在图片上绘制不规则图形,可以使用 OpenCV 库中的函数 `cv2.fillPoly()`。该函数可以在图像上绘制任意多边形。
以下是一个简单的例子,绘制了一个不规则的五边形并在其中填充颜色:
```python
import numpy as np
import cv2
# 创建一个黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 定义五个顶点坐标
pts = np.array([[10,100], [100,50], [200,150], [140,250], [30,200]], np.int32)
# 在图像上绘制多边形
cv2.fillPoly(img, [pts], (255,255,255))
# 显示图像
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的示例中,我们首先创建了一个大小为 512x512 的黑色图像。然后我们定义了五个顶点坐标,并使用 `cv2.fillPoly()` 函数在图像上绘制了一个多边形。最后,我们将图像显示出来。
如果要绘制更复杂的不规则图形,只需要定义更多的顶点坐标即可。
相关问题
给我写一个python打开图片可以使用鼠标在图片中绘制不规则框线的代码
以下是Python代码,可以打开图片并使用鼠标在图片中绘制不规则框线:
```python
import cv2
# 定义全局变量
drawing = False # 是否正在绘制
ix, iy = -1, -1 # 起始坐标
# 鼠标回调函数
def draw_rectangle(event, x, y, flags, param):
global ix, iy, drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
cv2.rectangle(img, (ix, iy), (x, y), (, 255, ), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img, (ix, iy), (x, y), (, 255, ), -1)
# 读取图片
img = cv2.imread('image.jpg')
# 创建窗口并绑定鼠标回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & xFF
if k == 27: # 按ESC键退出
break
cv2.destroyAllWindows()
```
运行代码后,会弹出一个窗口显示图片,可以使用鼠标在图片中绘制不规则框线。按ESC键退出程序。
python,opencv怎么获取图片中不规则图形的坐标?
### 使用 Python 和 OpenCV 获取图像中不规则形状轮廓坐标
为了获取图像中的不规则形状轮廓及其坐标,通常会采用如下方法:
#### 图像预处理
首先读取并转换图像为灰度图,接着应用阈值化操作来创建二值图像。这一步骤有助于突出显示目标对象。
```python
import cv2
import numpy as np
# 加载图片
image = cv2.imread('path_to_image')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊减少噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 阈值分割得到二值图像
_, thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY_INV)
```
#### 查找轮廓
通过 `cv2.findContours` 函数可以在二值图像上检测到所有的轮廓,并从中筛选出感兴趣的区域。
```python
contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
for contour in contours:
# 计算轮廓的矩形边界框
x, y, w, h = cv2.boundingRect(contour)
# 绘制矩形边框标记找到的对象位置
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 输出每个轮廓的位置信息
print(f"Contour Position: Top Left ({x},{y}), Width {w}, Height {h}")
```
上述代码实现了对输入图像内所有独立物体轮廓的识别与定位[^1]。
对于更复杂的场景,可能还需要进一步调整参数或增加额外的形态学运算(如腐蚀、膨胀),以便更好地分离粘连的目标物。
#### 提取特定条件下的轮廓
如果只关心满足一定面积大小或其他特征约束的轮廓,则可以通过设置过滤器来进行选择性的提取。
```python
filtered_contours = []
min_area = 100 # 设置最小感兴趣区域面积
for c in contours:
area = cv2.contourArea(c)
if area > min_area:
filtered_contours.append(c)
print(f"{len(filtered_contours)} large enough objects found.")
```
此部分展示了如何基于面积标准挑选较大的轮廓作为分析对象[^2]。
阅读全文