Python 代码使用 OpenCV 库实现了从摄像头获取视频流,并在视频中检测特定颜色区域的边缘线条

ops/2024/10/20 21:23:41/
python">import cv2
import numpy as np
#想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: "黄页小艺" 。
def extend_line_to_borders(x1, y1, x2, y2, width, height):# Compute the slope and interceptif x1 == x2 or abs(x2 - x1) < 1e-6:  # Vertical linereturn [(x1, 0), (x1, height)]else:slope = (y2 - y1) / (x2 - x1)intercept = y1 - slope * x1# Compute intersections with image bordersy_at_x_min = int(intercept)  # x = 0y_at_x_max = int(slope * width + intercept)  # x = widthif slope != 0:x_at_y_min = int(-intercept / slope)  # y = 0x_at_y_max = int((height - intercept) / slope)  # y = heightelse:x_at_y_min = 0x_at_y_max = widthpoints = []if 0 <= y_at_x_min <= height:points.append((0, y_at_x_min))if 0 <= y_at_x_max <= height:points.append((width, y_at_x_max))if 0 <= x_at_y_min <= width:points.append((x_at_y_min, 0))if 0 <= x_at_y_max <= width:points.append((x_at_y_max, height))return points[:2]  # Return two intersection pointscap = cv2.VideoCapture(0)if not cap.isOpened():print("无法打开摄像头")exit()# Set camera properties
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0.25)
cap.set(cv2.CAP_PROP_EXPOSURE, -5)
cap.set(cv2.CAP_PROP_AUTO_WB, 0)
cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 4000)# Color range in HSV
lower_color = np.array([0, 0, 70])
upper_color = np.array([92, 70, 219])while True:ret, frame = cap.read()if not ret:print("无法接收到帧 (摄像头已断开)")break# Convert to HSV color spacehsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# Filter black and white color regionsmask = cv2.inRange(hsv, lower_color, upper_color)# Use Canny edge detectionedges = cv2.Canny(frame, 100, 300)# Hough Line Transform to detect lineslines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)# Get image dimensionsheight, width = frame.shape[:2]if lines is not None:if len(lines) == 1:# Only one line detectedx1, y1, x2, y2 = lines[0][0]points = extend_line_to_borders(x1, y1, x2, y2, width, height)if len(points) == 2:cv2.line(frame, points[0], points[1], (0, 255, 0), 2)else:found_pair = False# Compute angles between pairs of linesfor i in range(len(lines)):for j in range(i + 1, len(lines)):x1_i, y1_i, x2_i, y2_i = lines[i][0]x1_j, y1_j, x2_j, y2_j = lines[j][0]# Direction vectorsv1 = np.array([x2_i - x1_i, y2_i - y1_i])v2 = np.array([x2_j - x1_j, y2_j - y1_j])# Normalize vectorsv1_norm = np.linalg.norm(v1)v2_norm = np.linalg.norm(v2)if v1_norm == 0 or v2_norm == 0:continue  # Skip zero-length vectorsv1_unit = v1 / v1_normv2_unit = v2 / v2_norm# Compute angle between vectorsdot_product = np.dot(v1_unit, v2_unit)angle = np.arccos(dot_product) * 180 / np.pi  # In degrees# Check if angle is approximately 90 degreesif abs(angle - 90) < 10:  # Threshold of 10 degrees# Extend and draw the linespoints_i = extend_line_to_borders(x1_i, y1_i, x2_i, y2_i, width, height)points_j = extend_line_to_borders(x1_j, y1_j, x2_j, y2_j, width, height)if len(points_i) == 2 and len(points_j) == 2:cv2.line(frame, points_i[0], points_i[1], (0, 255, 0), 2)cv2.line(frame, points_j[0], points_j[1], (0, 255, 0), 2)found_pair = Truebreakif found_pair:breakelse:# If no perpendicular pair found, you may choose to draw a single longest line or take other actionpass# Display the frame with detected linescv2.imshow('Camera', frame)# Press 'q' to exitif cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()#想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: "黄页小艺" 。

上面 Python 代码使用 OpenCV 库实现了从摄像头获取视频流,并在视频中检测特定颜色区域的边缘线条,然后进行以下操作:

一、定义辅助函数

  1. extend_line_to_borders函数:
    • 该函数用于将给定的线段延长至图像的边界。
    • 首先计算线段的斜率和截距。如果线段是垂直的(斜率为无穷大或接近无穷大),则直接返回与图像上下边界的交点。
    • 对于非垂直线段,根据斜率和截距计算与图像四个边界的交点。
    • 最后返回两个交点(如果存在)。

二、摄像头设置与图像预处理

  1. 打开摄像头并设置摄像头属性:

    • 使用cv2.VideoCapture(0)打开默认摄像头。
    • 设置摄像头的分辨率为 1280x720,自动曝光为特定值,手动设置曝光值为 -5,关闭自动白平衡并设置白平衡温度为 4000。
  2. 定义颜色范围并进行图像处理:

    • 在 HSV 颜色空间中定义一个颜色范围,用于过滤出特定颜色(可能是接近黑色和白色的颜色范围)。
    • 将每一帧图像从 BGR 颜色空间转换为 HSV 颜色空间。
    • 使用cv2.inRange函数根据定义的颜色范围创建一个掩码,用于过滤出特定颜色区域。
    • 使用 Canny 边缘检测算法对图像进行边缘检测,得到边缘图像。

三、线条检测与绘制

  1. 使用 Hough 变换检测直线:

    • 通过cv2.HoughLinesP函数在边缘图像上检测直线。
  2. 处理检测到的直线:

    • 如果只检测到一条直线,使用extend_line_to_borders函数将该直线延长至图像边界,并在图像上绘制延长后的直线。
    • 如果检测到多条直线,计算每对直线之间的夹角。如果夹角接近 90 度(在 10 度误差范围内),将这两条直线延长至图像边界并绘制在图像上。如果没有找到垂直的直线对,则可以选择绘制最长的直线或采取其他操作。
  3. 显示图像并等待退出:

    • 使用cv2.imshow函数显示带有检测到的直线的图像帧。
    • 当用户按下’q’键时,退出循环并释放摄像头资源,关闭所有窗口。

总体来说,这段代码实现了一个实时的视频处理程序,用于在摄像头捕获的视频中检测特定颜色区域的边缘,并找到垂直或接近垂直的直线对,将其延长至图像边界并绘制在图像上。#想和大神交朋友或想软件开发兼职接项目,请通过手机端搜小#程#序: “黄页小艺” 。


http://www.ppmy.cn/ops/125477.html

相关文章

基于深度学习的复杂器官建模与模拟

基于深度学习的复杂器官建模与模拟是一项前沿技术&#xff0c;它利用深度学习模型从大量医学图像和临床数据中提取信息&#xff0c;生成复杂器官的三维结构模型&#xff0c;并对其进行功能模拟。这项技术对于医学诊断、手术规划、药物开发和疾病研究有重要意义&#xff0c;特别…

【动态规划-最长递增子序列(LIS)】【hard】力扣1671. 得到山形数组的最少删除次数

我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3 存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1] < … < arr[i - 1] < arr[i] arr[i] > arr[i 1] > … &g…

手机解锁如何工作?解锁手机的顶级应用程序

解锁手机软件是指用于解锁特定运营商或网络的手机的计算机程序或工具&#xff0c;使其能够与其他运营商一起使用或在国际上使用。 当个人想要切换到不同的网络提供商或在国外旅行时使用其设备时&#xff0c;通常会使用此软件。以下是解锁手机软件的概述&#xff1a;需要注意的…

Java List 的介绍与实现原理

什么是 List 在 Java 中&#xff0c;List 是一种有序集合&#xff0c;允许重复的元素。它是 Java Collections Framework 的一部分&#xff0c;提供了一种便捷的方式来存储和操作线性数据。常见的实现类包括 ArrayList、LinkedList 和 Vector。 实现原理 1. ArrayList Arra…

selenium有多个frame页时的操作方法(5)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页&#xff1a;http://www.sahitest.com/demo/framesTest.h…

docker详解介绍+基础操作 (四)容器镜像

一.镜像结构和原理 Docker 镜像是 Docker 技术的核心组成部分之一&#xff0c;它用于封装应用程序及其依赖项&#xff0c;以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。 Dock…

开放式耳机咋选?开放式蓝牙耳机排行榜五强推荐推荐

​在当今的耳机市场上&#xff0c;开放式耳机因其时尚的外观和舒适的佩戴体验&#xff0c;已经成为广受欢迎的日常选择。然而&#xff0c;面对众多品牌和参差不齐的质量&#xff0c;选择一款合适的开放式耳机确实让人头疼。作为一名拥有三年耳机评测经验的博主&#xff0c;同时…

2024系统分析师考试---数据仓库相关概念

前言&#xff1a; 传统的操作型数据库主要面向业务的&#xff0c;所执行的操作基本上也是联机事务处理&#xff0c;随着企业规模的增长&#xff0c;历史积累的数据越来越多&#xff0c;如何利用历史数据来为未来决策服务&#xff0c;就显得越来越重要了&#xff0c;而数据仓库就…