当前位置: 首页 > news >正文

OpenCV-python小玩意2 摄像头预览时画线以及line的用法

0.我要做什么?

用OpenCV启动摄像头后,在预览界面用鼠标点击两点,画一条线。

1.初步方案或待解决的问题

本文依然是原型阶段,使用Python版的OpenCV。
画线的工作可以使用cv2.line方法;
鼠标事件使用setMouseCallback回调,监听左键下落事件。
整个流程简单描述为:
开始—监听鼠标—摄像头启动—记录鼠标左键按下的坐标—满足两点坐标,进行画线

2.函数介绍

2.1 cv2.line()

画线操作在图像处理中属于必备技能,函数原型如下:

cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

参数说明如下:

参数类型描述默认值
imgndarray要在其上绘制直线的目标图像(numpy 数组)
pt1tuple直线起点坐标 (x1, y1)
pt2tuple直线终点坐标 (x2, y2)
colortuple直线颜色 (B, G, R) 格式
thicknessint直线宽度(像素)1
lineTypeint直线类型:
- cv2.LINE_4: 4-connected 线
- cv2.LINE_8: 8-connected 线
- cv2.LINE_AA: 抗锯齿线
cv2.LINE_8
shiftint坐标点的小数位数0

使用方法,咱举个栗子:

import cv2
import numpy as np# 创建空白图像
image = np.zeros((400, 600, 3), dtype=np.uint8)# 水平红线(起点(100,200),终点(500,200))
cv2.line(image, (100, 200), (500, 200), (0, 0, 255), 2)# 垂直线(起点(300,100),终点(300,300))
cv2.line(image, (300, 100), (300, 300), (0, 255, 0), 3)# 对角线(蓝色,抗锯齿)
cv2.line(image, (100, 100), (500, 300), (255, 0, 0), 2, cv2.LINE_AA)# 显示结果
cv2.imshow('Lines Example', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

需要注意:

  1. 坐标系统
  • 原点在左上角 (0, 0)
  • 坐标使用整数元组 (x, y)
  • x 轴向右递增
  • y 轴向下递增
  1. 颜色表示
  • 使用 BGR 格式(不是常见的 RGB)
  • 每个通道值在 0-255 范围内,比如(0, 0, 255) 表示红色
  1. 线型选择
  • LINE_4:4-connected 线(快速绘制,锯齿明显)
  • LINE_8:8-connected 线(默认,效果较好)
  • LINE_AA:抗锯齿线(平滑效果,但计算量稍大)

2.2 cv2.setMouseCallback()

该方法用来处理鼠标的回调,它的函数原型如下:

cv2.setMouseCallback(windowName, onMouse, userdata=None)

参数说明:

  • windowName (str): 目标窗口名称。需与 cv2.namedWindow()cv2.imshow() 的窗口名严格一致。
  • onMouse (function):️ 鼠标回调函数,需按固定格式定义:
    def onMouse(event, x, y, flags, userdata): ...
  • userdata (可选): 向回调函数传递额外数据(如图像对象、类实例等),类型为 void*(Python中用 None 或对象)。

2.3 回调函数onMouse()

监听鼠标事件的回调函数,需要开发者自己定义,原型如下:

def onMouse(event, x, y, flags, userdata):

参数说明:

  1. event (int): 鼠标事件类型,常用值如下:
事件类型说明
cv2.EVENT_MOUSEMOVE0鼠标移动
cv2.EVENT_LBUTTONDOWN1左键按下
cv2.EVENT_LBUTTONUP4左键释放
cv2.EVENT_RBUTTONDOWN2右键按下
cv2.EVENT_LBUTTONDBLCLK7左键双击
cv2.EVENT_MOUSEWHEEL10滚轮滚动
  1. x, y (int): 鼠标在图像坐标系中的坐标。
  2. flags (int): 组合状态标志,常用值如下:
标志位说明
cv2.EVENT_FLAG_LBUTTON1左键拖拽中
cv2.EVENT_FLAG_CTRLKEY8按下 Ctrl 键
cv2.EVENT_FLAG_SHIFTKEY16按下 Shift 键
  1. userdata: 接收 setMouseCallback 传递的额外数据。

3.代码实现

import cv2points = []  # 存储坐标点def mouse_draw(event, x, y, flags, param):global pointsif event == cv2.EVENT_LBUTTONDOWN:points.append((x, y))  # 添加当前点到列表cv2.namedWindow('image')
cv2.setMouseCallback('image', mouse_draw)
cap = cv2.VideoCapture(1)  # 0是默认的,这里使用外接摄像头while True:ret, frame = cap.read()if not ret:break# 绘制所有线段if len(points) >= 2:for i in range(1, len(points)):cv2.line(frame, points[i - 1], points[i], (255, 0, 0), 2)cv2.imshow('image', frame)key = cv2.waitKey(30)if key == ord('q'):breakelif key == ord('c'):  # 清除功能points = []cap.release()
cv2.destroyAllWindows()

该程序也增加了键盘按键的响应,q键退出,c键清除屏幕的画线。
至此,我们又前进了一些,继续加油。

最终实现效果图:
预览时画线

http://www.dtcms.com/a/310178.html

相关文章:

  • Vue 引入字体文件YouSheBiaoTiHei
  • VMware 下 Ubuntu 操作系统下载与安装指南
  • 前沿智能推荐算法:基于多模态图神经网络的隐私保护推荐系统
  • 学习笔记:原子操作与锁以及share_ptr的c++实现
  • 调试 Rust 生成的 WebAssembly
  • OSPF综合实验报告册
  • 1 前言:什么是 CICD 为什么要学 CICD
  • vue打包后如何在本地运行?
  • sqli-labs:Less-17关卡详细解析
  • 数据结构:在链表中查找(Searching in a Linked List)
  • PyTorch分布式训练深度指南
  • Unity 打包程序在大屏上显示的问题、分辨率问题、UI适配问题、字体模糊不清问题
  • androidstudio调试apt
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-用户评论词云图实现
  • Apple基础(Xcode仨-Singxob)
  • 从零到一:构建基于本地LLM和向量数据库的法律智能问答系统(win11本地搭建)
  • 【C++进阶】一文吃透静态绑定、动态绑定与多态底层机制(含虚函数、vptr、thunk、RTTI)
  • 改进PSO算法!新自组织分层粒子群优化算法,具有变化的时间变化加速系数,附完整代码
  • 交通拥挤识别准确率↑32%:陌讯时空特征融合算法实战解析
  • 【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法
  • Redis深度剖析:从基础到实战(下)
  • 开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)
  • 什么类型网站适合WEB应用防火墙?
  • (27)运动目标检测之对二维点集进行卡尔曼滤波
  • 全国青少年信息素养大赛(无人飞行器主题赛(星际迷航)游记)
  • plc 以太网通讯模块实现:施耐德 PLC 多设备实时数据无缝协同应用案例
  • Java Validator自定义日期范围验证注解:实现不超过一年的时间跨度校验
  • 面向对象三大特性---封装
  • FileInputStream 和 FileOutputStream 简介
  • ubuntu22.04系统入门 linux入门(二) 简单命令 多实践以及相关文件管理命令