使用 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()

代码解释:

  1. 导入库: 导入 OpenCV 库 (cv2) 和 NumPy 库 (np)。
  2. detect_black_rectangle 函数:
    • 将视频帧转换为灰度图像。
    • 对灰度图像进行二值化处理,将黑色区域设置为白色,其他区域设置为黑色。
    • 查找图像中的轮廓。
    • 遍历每个轮廓,检查它是否满足以下条件:
      • 轮廓的边数为 4 (矩形)。
      • 轮廓的面积大于 1000 像素。
      • 轮廓是凸形的。
      • 轮廓内部的平均颜色值小于 50,表示为黑色。
    • 如果轮廓满足以上所有条件,则返回矩形的4个顶点坐标。
  3. 主循环:
    • 从摄像头获取视频帧。
    • 调用 detect_black_rectangle 函数识别黑色矩形。
    • 如果检测到矩形,则在视频帧中绘制矩形,并显示顶点坐标。
    • 在窗口中显示视频帧。
    • 当按下 ESC 键时退出程序。
  4. 释放资源: 释放摄像头和关闭窗口。

使用方法:

  1. 安装 OpenCV 库: pip install opencv-python
  2. 运行代码。
  3. 在摄像头前放置一个黑色矩形,代码会自动识别并显示顶点坐标。

注意:

  • 该代码假设黑色矩形是视频帧中唯一的一个。
  • 如果视频帧中有多个黑色矩形,则代码只会识别其中一个。
  • 代码中的阈值 50 可以根据实际情况进行调整。
  • 代码中的面积阈值 1000 可以根据实际情况进行调整,用于过滤掉太小的轮廓。
OpenCV 摄像头识别黑色矩形并获取顶点坐标

原文地址: https://www.cveoy.top/t/topic/fxxF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录