手把手教你玩转单目摄像头(OpenCv+Python)

news2024/11/16 21:02:36

目录

​编辑

一,单目应用前景

二,打开摄像头

三,设置分辨率

四,摄像头拍照

五,录制视频

六,单目结合OpenCV的实际应用


一,单目应用前景

单目视觉(monocular vision)在深度学习的应用非常广泛,它是计算机视觉和机器学习领域的热门研究方向之一。以下是一些单目视觉在深度学习中的主要应用:

  1. 深度估计:单目深度估计是使用单个摄像头来推断场景中物体的深度信息。深度学习模型,如卷积神经网络(CNN)和递归神经网络(RNN),已经在这一领域取得了显著的进展。这些模型可以根据输入图像来预测每个像素的深度值,从而实现立体视觉的效果。

  2. SLAM(Simultaneous Localization and Mapping):单目SLAM是指使用单个摄像头来同时定位相机的位置并构建场景的地图。深度学习可以用于改进SLAM中的视觉特征提取、运动估计和地图构建等关键步骤。

  3. 目标检测和跟踪:单目摄像头可用于检测和跟踪场景中的对象。深度学习模型,如YOLO(You Only Look Once)和Faster R-CNN,已广泛用于目标检测和跟踪任务。这对自动驾驶、智能监控和无人机等领域尤其重要。

  4. 语义分割:单目图像语义分割是指将图像中的每个像素标记为属于特定类别的一种任务。深度学习模型可以实现高精度的图像分割,用于识别道路、行人、车辆等。

  5. 人体姿态估计:单目摄像头可以用于估计场景中人体的姿态,包括关节位置和骨骼结构。深度学习模型在姿态估计中取得了很大的进展,可用于体育分析、虚拟现实和人机交互。

  6. 图像生成和超分辨率:深度学习模型,如生成对抗网络(GAN)和卷积神经网络(CNN),可以用于图像生成和超分辨率。这些技术可用于图像修复、风格转换和增强图像质量。

  7. 自动驾驶:单目视觉在自动驾驶领域中起着关键作用,它用于检测道路、车辆、行人和障碍物,并用于自动驾驶决策和路径规划。

  8. 虚拟现实:单目视觉用于虚拟现实应用,例如头显设备中的头部追踪、手部追踪和环境重建。

二,打开摄像头

OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);如果有两个摄像头,第二个摄像头则对应VideoCapture(1)。

在while循环中使用“摄像头对象”的read()函数一帧一帧地读取摄像头画面数据。

imshow函数是显示摄像头的某帧画面;cv2.waitKey(1)是等待1ms,如果期间检测到了键盘输入q,则退出while循环。

# -*- coding: utf-8 -*-
import cv2
 
cap = cv2.VideoCapture(0) # 0表示第一个摄像头
while(1):
    # get a frame
    ret, frame = cap.read()
    # show a frame
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

三,设置分辨率

有时需要指定摄像头的分辨率,比如1920*1080;

cap.set(3,1920) 设置帧的宽度为1920。cap.set(4,1080) 设置帧的长度为1080。

# -*- coding: utf-8 -*-
import cv2
 
cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
while(1):
    # get a frame
    ret, frame = cap.read()
    # show a frame
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

加入判断是否读到视频

# -*- coding: utf-8 -*-
import cv2
 
cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
while(1):
    # get a frame
    ret, frame = cap.read()
    if ret:
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        print("图像数据获取失败!!")
        break
cap.release()
cv2.destroyAllWindows()

四,摄像头拍照

拍照 = 保存图片,使用 cv2.imwrite 把当前摄像头的帧 数据写进去,保存为图片的形式;如果s键按下,则进行图片保存;

  1. cap.set(3,1920)

  2. cap.set(4,1080

  • 3 表示视频帧的宽度,即设置图像的宽度。
  • 4 表示视频帧的高度,即设置图像的高度。
# -*- coding: utf-8 -*-
import cv2
 
cap = cv2.VideoCapture(0)
#先设置分辨率,宽:1920 长:1080
cap.set(3,1920)
cap.set(4,1080)
# 图像计数 从1开始
img_count = 1
 
while(1):
    # get a frame
    ret, frame = cap.read()
    if ret:
        # show a frame
        cv2.imshow("capture", frame)
        # 等待按键事件发生 等待1ms
        key = cv2.waitKey(1)
        if key == ord('q'):
            # 如果按键为q 代表quit 退出程序
            print("程序正常退出..")
            break
        elif key == ord('s'):
            ## 如果s键按下,则进行图片保存
            # 写入图片 并命名图片为 图片序号.png
            cv2.imwrite("{}.png".format(img_count), frame)
            print("保存图片,名字为  {}.png".format(img_count))
            # 图片编号计数自增1
            img_count += 1
 
    else:
        print("图像数据获取失败!!")
        break
cap.release()
cv2.destroyAllWindows()

五,录制视频

保存图片使用的是cv2.imwrite(),要保存视频,需要创建一个VideoWriter对象,需要传入四个参数。

  • 输出的文件名,如’output.avi’
  • 编码方式FourCC码
  • 帧率FPS
  • 要保存的分辨率大小
# -*- coding: utf-8 -*-
import cv2
 
cap = cv2.VideoCapture(0)
# 定义编码方式并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))
 
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        outfile.write(frame)  # 写入文件
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) == ord('q'):
            break
    else:
        break

fourcc = cv2.VideoWriter_fourcc(*'MJPG') 定义视频编码方式,这里使用MJPG编码器。VideoWriter_fourcc 函数用于指定视频编码器,这是为了确保视频能够正确保存到文件中。

outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480)) 创建一个名为'output.avi'的视频文件写入对象,指定编码方式(MJPG),帧速率为25帧每秒,以及每帧的分辨率为(640, 480)像素。

使用 cv2.waitKey(1) 等待键盘输入。如果用户按下 'q' 键,就会退出循环。

六,单目结合OpenCV的实际应用

  1. 图像捕获和显示:使用单目摄像头捕获实时图像,然后使用OpenCV显示图像。这是最基本的用途,可用于监视、实时图像展示和调试。

  2. 图像处理和滤波:OpenCV提供了各种图像处理和滤波技术,例如模糊、边缘检测、颜色空间转换等。这些技术可用于图像增强、噪声去除和特征提取。

  3. 目标检测和跟踪:OpenCV包括用于目标检测和跟踪的功能,可以用于监控、自动驾驶、安防和机器人导航。

  4. 人脸检测和识别:OpenCV提供了人脸检测和识别的功能,用于各种应用,包括人脸解锁、人脸识别门禁系统和表情分析。

  5. 文档扫描和OCR:可以使用单目摄像头拍摄文档,然后使用OpenCV进行文档扫描和光学字符识别(OCR),以将文本从图像中提取出来。

  6. 虚拟现实和增强现实:单目摄像头用于虚拟现实和增强现实应用,包括头部追踪、手部追踪、物体识别和环境重建。

  7. 深度学习:OpenCV集成了深度学习库,可用于图像分类、对象识别、图像分割和深度估计等任务。单目摄像头结合深度学习可用于各种视觉任务。

  8. 机器视觉:单目摄像头结合OpenCV用于机器视觉任务,如零件检测、装配线检测、质量控制和工业自动化。

  9. 自动驾驶:单目摄像头用于自动驾驶系统,包括车道保持、交通标志检测和障碍物检测。

  10. 医疗影像分析:单目摄像头用于医学影像分析,包括X射线图像、MRI图像和皮肤病变检测。

  11. 环境监测:单目摄像头结合OpenCV用于监测环境条件,如天气、空气质量和自然灾害。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门03——程序流程结构

C/C支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构 顺序结构:程序按顺序执行,不发生跳转 选择结构:依据条件是否满足,有选择的执行相应功能 循环结构:依据条件是否满足,循环多次…

Leetcode刷题详解——寻找旋转排序数组中的最小值

1. 题目链接:153. 寻找旋转排序数组中的最小值 2. 题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&…

通俗介绍:什么是 Redis ?

刚接触 Redis 的伙伴们可能会因为不熟悉而感到困惑。本文简述 Redis 是什么、有哪些作用的问题,是一篇短浅而入门级别的文章。 Redis官网:Redis 打开 Redis 官网可以看到,官方对 Redis 的介绍是这样的:The open source, in-memo…

win10安装spark

一、进入spark下载页面 连接 Downloads | Apache Spark 二、解压下载后的.tgz文件 直接解压即可 三、运行 运行bin目录下的 spark-shell.cmd 提示 Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.hom…

如何理解某一个开发框架的意图,从而去写和落代码文件位置不会出错

理解一个开发框架的意图并正确地组织代码和文件位置是一个重要的技能。这不仅需要对框架本身有深入的理解,还需要对框架背后的设计哲学和最佳实践有所了解。以下是一些帮助你达到这一目标的步骤和建议: 1. 学习框架的文档 详细阅读: 开始使用任何框架前…

基于Java的学生学籍管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

智慧矿山:AI算法助力!刮板机监测,生产效率和安全性提升!

工作面刮板机在煤矿等采矿场景中起着重要作用。为了提高其生产效率和安全性,研究人员开发了一种基于 AI 算法的刮板机监测技术。 在传统的刮板机监测中,通常需要人工观察和判断刮板机的状态。这种方法存在许多问题,如主观性、耗时和易出错等。…

MobileNetV3

相对重量级网络而言,轻量级网络的特点是参数少、计算量小、推理时间短。更适用于存储空间和功耗受限的场景,例如移动端嵌入式设备等边缘计算设备。因此轻量级网络受到了广泛的关注,其中MobileNet可谓是其中的佼佼者。MobileNetV3经过了V1和V2…

C++简单实现内存池原理

前言 该代码仅用于学习和理解其原理&#xff0c;当然高效内存池肯定是需要算法的。 // demo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#pragma pack(1) #include <iostream> using namespace std; //简单内存池 class gril { public…

国产内存强势崛起,光威龙武挑战D5内存24×2新标杆

今年国产内存的表现非常亮眼&#xff0c;出现了很多高质量的普惠产品&#xff0c;像是最近光威推出的一款内存条龙武ddr5 242就很有竞争力&#xff0c;加上之前神策新加入的ddr5 242版本&#xff0c;都是备受瞩目的新品&#xff0c;凭实力把DIY主机的内存配置拉高到了48GB。 龙…

Python遍历删除列表元素的一个奇怪bug

假定有一个Python列表&#xff0c;比如[CFFEX.IF, CFFEX.TS,SHFE.FU]&#xff0c;现在需要将其中带‘CFFEX’前缀的所有元素都删除。在使用列表推导式一行代码搞定之前&#xff0c;用了一种最朴素的遍历删除方法&#xff0c;结果出现了意想不到的的问题。复盘了下&#xff0c;结…

【带头学C++】----- 1.基础知识 ---- 1.23 运算符概述

1.23 运算符概述 运算符&#xff0c;在数学中常见的加减乘除之类的符号&#xff0c;那么在C在编程语言中呢&#xff0c;将使用特定的符号或标记对操作数进行操作以生成结果。用算术运算符将运算对象(也称操作数)连接起来的、符合C 语法规则的式子&#xff0c;称为C 算术表达式运…

配置Sentinel 控制台

1.遇到的问题 服务网关 | RuoYi 最近调试若依的微服务版本需要用到Sentinel这个组件&#xff0c;若依内部继承了这个组件连上即用。 Sentinel是阿里巴巴开源的限流器熔断器&#xff0c;并且带有可视化操作界面。 在日常开发中&#xff0c;限流功能时常被使用&#xff0c;用…

《现代音乐人编曲手册_传统管弦乐配器和MIDI》 笔记

MIDI 已经广泛应用在音乐制作的各个领域&#xff0c;但模仿传统管弦乐队的演奏仍是公认的 MIDI制作难点。很多制作者使用了庞大的采样音源&#xff0c;但仍然制作不出像样的管弦乐作品。即便是音乐专业出身、学习过传统管弦乐配器法的专业人士&#xff0c;也经常出现“谱面没问…

UGO+DRS评复之路

前言 针对数据库整体迁移方案&#xff0c;为解决异构平台数据库迁移&#xff0c;为减轻迁移人员的工作强度以及迁移周期。华为云GaussDB迁移UGO&DRS迁移工具应运而生。 UGO介绍 数据库和应用迁移&#xff08;Database and Application Migration UGO&#xff0c;简称为UG…

2 https原理

1 HTTPS与HTTP的区别&#xff1f;

Linux友人帐之日志与备份

一、日志 1.1概述 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要&#xff0c;它记录了系统每天发生的各种事情&#…

【lesson1】数据库基础

文章目录 连接数据库服务器什么是数据库初步见识数据库 连接数据库服务器 指令&#xff1a; -h&#xff1a;指明登入部署了MySQL服务的主机 -P&#xff1a;指明我们要访问的端口号 -u&#xff1a;指明登入用户 -p&#xff1a;指明需要输入密码 什么是数据库 在Linux查看具…

高防CDN:保卫您的网站免受攻击之利与弊

在当今数字化时代&#xff0c;网络安全对于网站经营者至关重要。高防CDN&#xff08;Content Delivery Network&#xff09;技术旨在提供强大的安全性&#xff0c;以保护网站免受恶意攻击。本文将探讨高防CDN为普通网站带来的优势与不足之处&#xff0c;并分析国内外高防CDN的发…

Use nvidia card in docker

1.确保在宿主机上已经安装了nvidia 显卡的驱动 $ nvidia-smi 2.准备Nvidia-docker的环境 $ distribution$(. /etc/os-release;echo $ID$VERSION_ID) && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/k…