下面是详细的"Python OpenCV实现目标外接图形"攻略。
1. 安装OpenCV库
在终端中输入以下命令安装OpenCV:
pip install opencv-python
2. 导入OpenCV模块
import cv2
import numpy as np
3. 加载图像
img = cv2.imread('image.jpg')
4. 对图像进行预处理
在进行目标检测之前,需要对图像进行预处理,例如灰度化、滤波等操作。以下代码展示了如何将图像灰度化。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
5. 创建目标外接图形
使用OpenCV的findContours()函数查找兴趣区域的轮廓。然后,使用approxPolyDP()函数查找轮廓近似的多边形,并将其与原始图像进行比较。最后,可以使用drawContours()函数在图像上绘制目标外接图形。以下是示例代码:
# 找到轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 获取轮廓中的目标形状并绘制外接图形
for contour in contours:
peri = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.02 * peri, True)
cv2.drawContours(img, [approx], -1, (0, 255, 0), 2)
在上述代码中,使用approxPolyDP()函数以2%周长的精度计算轮廓的近似多边形。将绘制出的轮廓与原始图像一起保存可能看起来像以下内容:
cv2.imwrite('output.jpg', img)
示例1:检测并绘制矩形框
以下是如何检测并绘制矩形框的示例。假设我们要检测并框选出图像中的红色矩形。
img = cv2.imread('image.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
mask = mask1 + mask2
# 膨胀操作
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(mask, kernel, iterations=1)
# 找到目标轮廓
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if w * h > 100:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imwrite('output.jpg', img)
示例2:检测并绘制圆形
以下是如何检测并绘制圆形的示例。我们要检测并框选出图像中的红色圆形。
img = cv2.imread('image.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
mask = mask1 + mask2
# 膨胀操作
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(mask, kernel, iterations=1)
# 查找检测到的圆形
circles = cv2.HoughCircles(dilation, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=0, maxRadius=0)
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, 255, 0), 2)
cv2.imwrite('output.jpg', img)
这两个示例演示了如何使用OpenCV实现检测和绘制目标外接图形的功能。当然,这只是OpenCV提供的功能之一,您还可以自己制定算法进行目标外接图形的处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python opencv实现目标外接图形 - Python技术站