OpenCV 摄像头识别黑色矩形并获取顶点坐标
使用 OpenCV 识别黑色矩形并获取顶点坐标
这段代码使用 OpenCV 库调用摄像头实时识别黑色矩形,并输出矩形的4个顶点坐标 (x1, y1), (x2, y2), (x3, y3), (x4, y4)。
import cv2
import numpy as np
def detect_black_rectangle(frame):
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 对图像进行二值化处理
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# 计算轮廓的周长
perimeter = cv2.arcLength(contour, True)
# 根据周长进行近似处理
approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
# 如果近似得到的轮廓是矩形且颜色为黑色,则输出顶点坐标
if len(approx) == 4 and cv2.contourArea(approx) > 1000 and cv2.isContourConvex(approx):
if cv2.mean(frame, mask=approx)[0] < 50:
x1, y1 = approx[0][0]
x2, y2 = approx[1][0]
x3, y3 = approx[2][0]
x4, y4 = approx[3][0]
return (x1, y1), (x2, y2), (x3, y3), (x4, y4)
return None
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取摄像头帧
ret, frame = cap.read()
if ret:
# 调用函数进行矩形识别
result = detect_black_rectangle(frame)
if result is not None:
# 绘制矩形
cv2.polylines(frame, [np.array(result)], True, (0, 255, 0), 2)
# 输出顶点坐标
cv2.putText(frame, f'x1,y1: {result[0]}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f'x2,y2: {result[1]}', (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f'x3,y3: {result[2]}', (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f'x4,y4: {result[3]}', (10, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# 显示帧
cv2.imshow('Frame', frame)
# 按下ESC键退出
if cv2.waitKey(1) == 27:
break
# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()
代码解释:
- 导入库: 导入 OpenCV 库 (cv2) 和 NumPy 库 (np)。
detect_black_rectangle函数:- 将视频帧转换为灰度图像。
- 对灰度图像进行二值化处理,将黑色区域设置为白色,其他区域设置为黑色。
- 查找图像中的轮廓。
- 遍历每个轮廓,检查它是否满足以下条件:
- 轮廓的边数为 4 (矩形)。
- 轮廓的面积大于 1000 像素。
- 轮廓是凸形的。
- 轮廓内部的平均颜色值小于 50,表示为黑色。
- 如果轮廓满足以上所有条件,则返回矩形的4个顶点坐标。
- 主循环:
- 从摄像头获取视频帧。
- 调用
detect_black_rectangle函数识别黑色矩形。 - 如果检测到矩形,则在视频帧中绘制矩形,并显示顶点坐标。
- 在窗口中显示视频帧。
- 当按下 ESC 键时退出程序。
- 释放资源: 释放摄像头和关闭窗口。
使用方法:
- 安装 OpenCV 库:
pip install opencv-python - 运行代码。
- 在摄像头前放置一个黑色矩形,代码会自动识别并显示顶点坐标。
注意:
- 该代码假设黑色矩形是视频帧中唯一的一个。
- 如果视频帧中有多个黑色矩形,则代码只会识别其中一个。
- 代码中的阈值 50 可以根据实际情况进行调整。
- 代码中的面积阈值 1000 可以根据实际情况进行调整,用于过滤掉太小的轮廓。
原文地址: https://www.cveoy.top/t/topic/fxxF 著作权归作者所有。请勿转载和采集!