Python 调用手机摄像头

Python 调用手机摄像头

Python 调用手机摄像头

在手机上安装软件

这里以安卓手机作为演示,ISO也是差不多的
软件下载地址

注意:要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 )

安装完打开IP摄像头服务器

在这里插入图片描述

点击分享查看IP

在这里插入图片描述

查看局域网的IP

在这里插入图片描述

用Python的Opencv写一个代码来连接手机摄像头

安装opencv-python

pip install opencv-python 

注意

  • 保存的照片在当前的py文件同级目录下面的img里面

手机横着,电脑显示的也是横着,反之

# 将图像旋转90度以竖直显示 img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)# 5. 旋转图像

可能安装库太慢可以这样(这里使用的是清华的镜像)

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/ 

使用

  • 窗口和手机一样竖直显示
  • ESC退出:key == 27 用于检测 ESC 键被按下。当检测到 ESC 键时,循环终止并退出。
  • 空格保存图片:当按下空格键时,图片被保存,并且文件名基于当前的时间戳。

代码

import cv2 import os from datetime import datetime # 创建窗口,设置为不能改变大小 cv2.namedWindow('camera', cv2.WINDOW_NORMAL)# 1. 修改窗口属性,允许改变大小# 摄像头设置,这里使用的是网络摄像头的URL video ='http://admin:[email protected]:8081' capture = cv2.VideoCapture(video)# 2. 初始化摄像头# 开始无限循环,直到用户中断whileTrue: success, img = capture.read()# 3. 从摄像头读取一帧图像ifnot success:print("无法抓取帧")# 4. 如果读取失败,打印错误信息并退出循环break# 将图像旋转90度以竖直显示 img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)# 5. 旋转图像# 显示图像 cv2.imshow("camera", img)# 6. 在窗口中显示图像# 按键处理 key = cv2.waitKey(10)# 7. 等待用户按键,10毫秒响应一次if key ==27:# 8. 如果按下ESC键(ASCII码为27),退出循环breakelif key ==ord(' '):# 9. 如果按下空格键(ASCII码为32),保存图片# 保存图片到当前目录下的img文件夹中 img_folder ='img'ifnot os.path.exists(img_folder): os.makedirs(img_folder)# 10. 如果不存在img文件夹,则创建# 使用时间戳作为文件名 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") img_filename =f"{img_folder}/{timestamp}.jpg"# 11. 生成图片文件名 cv2.imwrite(img_filename, img)# 12. 保存图片print(f"Saved image {timestamp}.jpg")# 释放摄像头资源 capture.release()# 关闭所有OpenCV创建的窗口 cv2.destroyAllWindows()

注意

video的地址替换为查看局域网的IP时看到的地址

在这里插入图片描述

展示效果

电脑端

在这里插入图片描述

手机拍摄

在这里插入图片描述

分辨率低,也就是图片还是有点模糊

解释

导入必要的库
import cv2 import os 

首先,导入cv2模块(OpenCV库)用于图像处理和视频流操作,以及os模块用于文件路径操作。

创建窗口
cv2.namedWindow('camera', cv2.WINDOW_NORMAL)

创建一个名为camera的窗口,并设置为可以改变大小。

摄像头设置
video ='http://admin:[email protected]:8081' capture = cv2.VideoCapture(video)

设置网络摄像头的URL,并初始化摄像头对象。

初始化保存图片的序号
p =1

初始化一个变量p用于保存图片时的序号。

主循环
whileTrue:

开始一个无限循环,用于持续捕获和处理视频帧。

读取视频帧
success, img = capture.read()

从摄像头捕获一帧图像。success是一个布尔值,表示是否成功捕获帧,img是捕获到的图像。

图像旋转
ifnot success:print("无法抓取帧")break img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

如果未能成功捕获帧,则打印错误信息并退出循环。成功捕获后,将图像旋转90度以竖直方向显示。

显示图像
cv2.imshow("camera", img)

将旋转后的图像显示在之前创建的camera窗口中。

按键处理
key = cv2.waitKey(10)

等待用户按键操作,如果在10毫秒内有按键则响应。

if key ==27:breakelif key ==ord(' '):

如果用户按下ESC键(ASCII码为27),则退出循环。如果按下空格键(ASCII码为32),则保存当前帧为图片。

保存图片
img_folder ='img'ifnot os.path.exists(img_folder): os.makedirs(img_folder) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") img_filename =f"{img_folder}/{timestamp}.jpg" cv2.imwrite(img_filename, img)print(f"Saved image {timestamp}.jpg")

检查是否存在名为img的文件夹,如果不存在则创建。生成图片文件名,并将当前帧保存为图片。打印保存图片的信息,并更新图片序号。

释放资源
capture.release() cv2.destroyAllWindows()

循环结束后,释放摄像头资源,并关闭所有OpenCV创建的窗口。

👇 源码资料获取 · 技术与交流 👇

在这里插入图片描述

Read more

C++之多态

C++之多态

多态 * 什么是多态? * 多态的定义及实现 * 多态的构成条件 * 虚函数 * 虚函数的重写/覆盖 * 关键技术原理 * 最佳实践指南 * 虚函数重写 * 协变 * 析构函数的重写 * override和final关键字 * 纯虚函数和抽象类 * 多态的原理 * 多态是如何实现的 * 1. 虚函数表(vtable) * 虚函数表知识要点 * 2. 虚函数的声明 * 3. 多态的实现过程 * 动态绑定与静态绑定 什么是多态? 多态(Polymorphism)是面向对象编程的三大核心特性之一(封装、继承、多态),源于希腊语"多种形态"。在C++中,它允许我们使用统一的接口处理不同类型的对象,显著提高了代码的灵活性和可扩展性。 核心概念 1. 同一接口,多种形态 不同的对象可以通过相同的方法名调用,但实际执行的逻辑由对象自身的类决定。 2. 解耦调用与实现 调用者只需关注接口(方法名和参数)

By Ne0inhk
【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

文章目录 * 一、泛型编程 * 二、函数模板 * 1. 函数模板的概念和格式 * 2. 函数模板的原理 * 3. 函数模板的实例化 * 隐式实例化 * 显式实例化 * 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础,可能不太好理解,这里我给大家举一个现实生活中的例子,我们想做很多个草莓形状的橡皮泥玩具,并且这些草莓玩具颜色不同,效果如下: 问题来了,我们该怎么解决这个问题呢?难道拿出不同颜色的橡皮泥开始一个一个捏吗?但是这样的话效率是不是很低呢?所以我们会这样想,既然这些草莓玩具的形状相同,只是颜色不同,我们是不是可以做一个草莓模具,当我们想做一个草莓玩具的时候,就可以将对应颜色的橡皮泥填充模具,最终得到这个草莓,如下: 这样我们有了模具以后,只需要使用对应颜色的橡皮泥就可以批量制作草莓了,非常高效,这就属于泛型编程的思维,大家可能还是感受不到,我们再举一个有关编程的例子,也就是使用C语言实现两个变量的交换,如下: voidSwap(int& x,int&

By Ne0inhk
改造红黑树实现封装 map/set:感受C++ 标准容器的精妙设计与底层实现

改造红黑树实现封装 map/set:感受C++ 标准容器的精妙设计与底层实现

容器map/set的底层是红黑树,这一篇详解红黑树如何封装实现map/set。 1.map/set设计的巧妙之处 map是key/value类型,set是key类型,两个冲突的参数类型,是如何由红黑树封装而成? 暴力思路:两个红黑树,一个kv,一个k。可是这样代码复用率极低,维护成本高。 源码思路:利用 键提取器——仿函数 提取kv、k的key,用一颗红黑树实现map,set C语言一般用函数指针,但是它十分麻烦,C++有了仿函数就很方便 接下来在红黑树基础上封装map和set 2.map和set的实现 2.1map和set的基本框架 + 原红黑树结构变化 map是key、value结构,set是key结构:  既然我们要用一个红黑树封装实现map和set,那传的参数就得通用: 原本是K,V结构,现在,要改成通用的,就用T吧 T根据需要,可选择传pair<K,

By Ne0inhk

MAVLink 通信协议 C++ 开发实战:从环境搭建到飞控通信全解析

前言 MAVLink(Micro Air Vehicle Link)是一款轻量级、低带宽、高可靠性的微小型无人机通信协议,由 PX4 团队主导设计,广泛应用于无人机、无人车、机器人等嵌入式系统的跨设备通信场景。其核心优势在于专为资源受限的硬件(如 MCU、小型嵌入式板卡)优化,采用二进制编码格式,相比 JSON、XML 等文本协议,传输效率提升数倍,同时支持数据校验、重传机制,能在复杂电磁环境下保证通信稳定性。 从 MAVLink 协议核心原理出发,结合 C++ 语言实现完整的通信流程,涵盖协议环境搭建、消息编解码、串口 / 网络通信、数据收发实战等核心内容,所有代码均可直接移植到 Linux/Windows 嵌入式环境,助力快速上手 MAVLink C++ 开发。 一、MAVLink

By Ne0inhk