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

OpenCV(Python)基础—9小时入门版

OpenCV(Python)基础—9小时入门版

# =============================================
# Author : Mikigo
# Time   : 2021/12/1
# =============================================

一、一句话简介

OpenCV (Open Source Computer Vision Library) 是用 C++ 语言编写,提供 PythonJava 等语言 API的一个开源计算机视觉库。

二、安装

1、Debian 系使用 apt 安装 OpencCV

sudo apt install python-opencv

UOS 系统上,也可以使用:

sudo apt install python3-opencv

支持 AMDARMMIPS 架构安装。

2、安装 NumPy

NumPy 是 Python中的一个运算速度非常快的数学库,数组玩到起飞,如果你玩数据科学、机器学习,这是必学库。所有 OpenCV 数组结构都转换为 NumPy 数组,要想 OpenCV 学得好,必须熟悉它,学习 OpenCV 基础多少需要了解一点。

sudo apt -y install python3-numpy

好多同学安装 Python 库都习惯使用 pip 安装,实际上 OpenCV 也可以,但是目前只支持在 AMD,所以考虑到兼容性还是建议使用 apt 进行安装,并且官方文档也是建议使用 apt 安装。

三、入门基础

所有 OpenCV 类和函数都放在 cv 名称空间中,在 py 文件中导入:

import cv2 as cv

后续内容默认都使用了导入。

1、图像

1.1、读图像
img = cv.imread()
  • 参数1:文件路径。(str)
  • 参数2:读取图像的方式。
    • cv.IMREAD_COLOR 加载一个彩色图像,忽略 alpha 通道。(默认值)
    • cv.IMREAD_GRAYSCALE 加载图像为灰度模式。
    • cv.IMREAD_UNCHANGED 加载图像,包括 alpha 通道。
    • 还可以简单地分别传递整数1、0或 -1。
1.2、显示图像
cv.show()
  • 参数1:窗口名称。(str)
  • 参数2:图像。(obj)

在窗口中显示图像,窗口自动适合图像大小。

销毁窗口

cv.destroyAllWindows() # 销毁所有窗口
cv.destroyWindow("window_name") # 销毁某个窗口,参数传入窗口名称
1.3、写图像
cv.imwrite()
  • 参数1:文件名。
  • 参数2:图像。(obj)

2、视频

2.1、从摄像头捕获视频
cap = cv.VideoCapture(0)

它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。一般我们连接一个摄像头,所以传0(或-1)。当然可以通过传递1来选择第二个相机,以此类推。

import cv2 as cv
cap = cv.VideoCapture(0)# 判断是否打开
if not cap.isOpened(): exit()
while True:  # 逐帧捕获ret, frame = cap.read()  # 判断是否读取到if not ret:  break# 转灰度gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示图像cv.imshow('frame', gray)# 监控键盘信号if cv.waitKey(1) == ord('q'):break
# 释放
cap.release()
cv.destroyAllWindows()

一切都看起来很和谐哈。

需要注意其他的两个判断:

  • 有时候摄像头可能没有初始化成功,所以用cap.isOpened() 来判断,并退出。
  • 可能没有接收到帧,停止循环。

获取视频的一些属性:

cap.get(id)

id 是一个从0到18的数字,每个数字表示视频的一个属性。每个属性代表什么→(docs.opencv.org/4.1.2/d4/d1…

cap.set() 属于进阶用法,这里按下不表。

2.2、从文件中播放视频

原理和从摄像头中捕获是一样的,区别在于:

cap = cv.VideoCapture('vtest.avi')

参数是文件名称。

2.3、保存视频
out = VideoWriter()
  • 参数1:文件名
  • 参数2:fourcc = cv.VideoWriter_fourcc(*‘XVID’)
    • FourCC 是一个4字节的代码,用于指定视频编解码器。
    • DIVX, XVID, MJPG, X264, WMV1, WMV2
    • 不同的操作系统有差异 www.fourcc.org/codecs.php
  • 参数3:帧率
  • 参数3:分辨率
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():ret, frame = cap.read()if not ret:break# 旋转后写入frame = cv.flip(frame, 0)out.write(frame)cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break
# 释放
cap.release()
out.release()
cv.destroyAllWindows()

结合前面摄像头捕获视频的代码,看起来很简单~

3、绘图

3.1、画线
cv.line()

举例:创建一个黑色图像,并从左上角到右下角在上面画一条蓝线

import numpy as np
import cv2 as cv
# 写一个黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 画一根5像素款的蓝线
cv.line(img,(0,0),(511,511),(255,0,0),5)

(255,0,0) 代表蓝色,最后一个参数是线的宽度。

3.2、画圆
cv.circle(img,(447,63), 63, (0,0,255), -1)

参数:中心坐标和半径

3.3、画矩形
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

参数:矩形的左上角和右下角

支持其他图形。。。

四、核心功能

1、图像的基本操作

1.1、访问和修改像素值
import numpy as np  # 官方建议固定写法
import cv2 as cv
img = cv.imread('messi5.jpg')
px = img[100,100]  
# (100, 100)的像素值[157 166 200](B、G和R值)
blue = img[100,100,0] 

修改

img[100,100] = [255,255,255]

直接赋值即可修改,但是直接访问非常缓慢,更好的像素访问和编辑方法:

img.item(10,10,2)  # 访问R值
img.itemset((10,10,2),100)  # 修改R值
1.2、访问图像属性

图像属性包括行数、列数和通道数、图像数据类型、像素数等。

img.shape
# (342,548,3)

返回一个行、列和通道数的元组。

img.size  # 访问像素总数
1.3、特定区域

机器学习中经常需要抠图,比如人脸识别时,一般会先选择人脸区域,搜索其中的眼睛,而不是搜索整个图像,以提供精确度。

ball = img[280:340, 330:390] # 抠一个区域
img[273:333, 100:160] = ball # 复制到另一个区域
1.4、图像信道的分裂与合并
b,g,r = cv.split(img)  # 分裂
img = cv.merge((b,g,r))  # 合并

或者

b = img[:,:,0]

比如将所有红色像素设置为零

img[:,:,2] = 0

2、图像的算术运算

2.1、图片添加
cv.add()

可以添加两个图像

x = np.uint8([250])
y = np.uint8([10])
cv.add(x + y)  # 250+10 = 260 => 255

OpenCV 的加法和 Numpy 的加法是有区别的。OpenCV 加法是一个饱和操作,而 Numpy 加法是一个除余操作。

x + y  # 250+10 = 260 % 256 = 4
2.2、图像混合
cv.addWeighted()

也是图像添加,但不同的权重给予图像,使它给人一种混合或透明的感觉。

  • 参数1、2:图像1及其权重。
  • 参数3、4:图像2及其权重。
  • 参数5:图像混合的α 值,通过改变 α 从0→1,你可以在一张图片到另一张图片之间进行一个很魔幻的转换。
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
# 第一幅图像的权重为0.7,第二幅图像的权重为0.3
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
2.3、按位操作

按位 AND、 OR、 NOT 和 XOR 操作。

可以理解为图像的逻辑运算:

img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 把标志放在左上角,所以创建了一个roi
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 创建一个标志图案,以及它的反面
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) # 灰度处理
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 黑掉 ROI 中的 logo 区域
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 只取标志图像中的标志区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将 logo 放入 ROI 中,并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

五、图像处理

1、改变色彩空间

OpenCV 目前有150多种颜色空间转换方法。但其中两个最广泛使用的:

1.1、Gray

cv.COLOR_BGR2GRAY

顾名思义:BGR → Gray

这个图像识别中经常使用,可以提供识别速度和准确度。

1.2、HSV

cv.COLOR_BGR2HSV

顾名思义:BGR → HSV

HSV 图像可以用它来提取有色物体在 HSV 中,比在 BGR 颜色空间中更容易表示颜色。

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while True:# 取出视频的每一帧_, frame = cap.read()# 从 BGR 到 HSV 颜色空间的转换hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)# 定义 HSV 中蓝色的范围lower_blue = np.array([110,50,50])upper_blue = np.array([130,255,255])# 得到蓝色mask = cv.inRange(hsv, lower_blue, upper_blue)# 按位-and 蒙版和原始图像res = cv.bitwise_and(frame,frame, mask= mask)cv.imshow('frame',frame)cv.imshow('mask',mask)cv.imshow('res',res)k = cv.waitKey(5) & 0xFFif k == 27:break
cv.destroyAllWindows()

2、几何变换

2.1、缩放
res = cv.resize(InputArray, OutputArray, Size, fx, fy, interpolation)
参数解释
nputArray src输入图片
OutputArray dst输出图片
Size输出图片尺寸
fx, fy沿x轴,y轴的缩放系数
interpolation插入方式

interpolation 默认情况下,使用的插值方法是 cv.INTER_LINEAR,用于所有调整大小。

举例:

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
2.2、旋转
cv.getRotationMatrix2D()

旋转90度:

img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
# cols-1 and rows-1 are the coordinate limits.
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))

3、图像阈值化

3.1、自适应阈值分割

如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。

ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
  • cv.THRESH_BINARY
  • cv.THRESH_BINARY_INV
  • cv.THRESH_TRUNC
  • cv.THRESH_TOZERO
  • cv.THRESH_TOZERO_INV

如果一个图像在不同的区域有不同的照明条件,全局使用一个阈值一般是不可用的,对同一幅图像的不同区域采用不同的阈值,对不同光照条件下的图像取得了较好的效果。

  • cv.ADAPTIVE_THRESH_MEAN_C 阈值是邻近区域的平均值减去常数 c
  • cv.ADAPTIVE_THRESH_GAUSSIAN_C 阈值是邻域值减去常数 c 的高斯加权和
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('sudoku.png',0)
img = cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)','Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()

4、模板匹配

4.1、单目标匹配

模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。

cv.matchTemplate()
  • 参数1:大图
  • 参数2:小图
  • 参数3:匹配方法
    • cv.TM_CCOEFF
    • cv.TM_CCOEFF_NORMED
    • cv.TM_CCORR
    • cv.TM_CCORR_NORMED
    • cv.TM_SQDIFF
    • cv.TM_SQDIFF_NORMED

查找最大/最小值

 cv.minMaxLoc()
res = cv.matchTemplate(source, template, cv.TM_CCOEFF_NORMED)
cv.minMaxLoc(res)
4.2、多目标匹配

cv.minMaxLoc()不会给出所有位置。

通过阈值处理多个模板匹配。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
loc = np.where( res >= 0.8)
for pt in zip(*loc[::-1]):cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

相关文章:

OpenCV(Python)基础—9小时入门版

OpenCV(Python)基础—9小时入门版 # # Author : Mikigo # Time : 2021/12/1 # 一、一句话简介 OpenCV (Open Source Computer Vision Library) 是用 C 语言编写,提供 Python、Java 等语言 API的一个开源计算机视觉库。 二、安装 1、Debian 系使用 apt 安装 O…...

SpringBoot整合Canal

一 linux docker compose版本 1.第一步:基础环境 (1)第1步:安装jak、maven、git、nodejs、npm yum install maven mvn -v 安装maven时会帮安装jdkyum install git git --version 2.27.0yum in…...

用 Python 提取某一个公众号下的所有文章

当我们想要提取某一个公众号下的所有文章时,我们可以借助微信公众平台的开放接口,通过Python编写一个爬虫程序来实现。下面是一个示例代码,以及如何将其转化为一篇详细的微信公众号推文文章。 1. 导入所需库 首先,我们需要导入所…...

鸿蒙4.0实战教学—基础ArkTS(简易视频播放器)

构建主界面 主界面由视频轮播模块和多个视频列表模块组成,效果图如图: VideoData.ets中定义的视频轮播图数组SWIPER_VIDEOS和视频列表图片数组HORIZONTAL_VIDEOS。 // VideoData.ets import { HorizontalVideoItem } from ./HorizontalVideoItem; impo…...

4. 深入 Python 流程控制

​​​​​​ 4. 深入 Python 流程控制 除了前面介绍的 while 语句,Python 还从其它语言借鉴了一些流程控制功能,并有所改变。 4.1. if 语句 也许最有名的是 if 语句。例如: >>> x int(raw_input("Please enter an integer: "))…...

2000-2022年上市公司股票流动性指标数据/股票流动性Amihud(原始数据+计算代码+计算结果)

2000-2022年上市公司股票流动性指标数据/股票流动性Amihud(原始数据计算代码计算结果) 1、时间:2000-2022年 3、指标:证券代码_没有单位、交易日期_没有单位、日个股交易金额_元、考虑现金红利再投资的日个股回报率_没有单位、交…...

Unity 数据存储PlayerPrefs管理类

Unity 数据存储PlayerPrefs管理类 Unity 数据存储PlayerPrefs管理类实现存取实体类对象存储格式为Json格式Singleton.csInventoryEntity.csDataManager.cs用法如下 Unity 数据存储PlayerPrefs管理类 实现存取实体类对象 存储格式为Json格式 源码如下: Singleton…...

一篇文章学会如何使用 NestJS 过滤器处理系统全局异常情况

前言 在实际的应用开发中,你或许遇到过异常处理机制不统一或错误信息展示混乱的现象。为了解决这些问题,NestJS提供了一个优雅的解决方案:过滤器(Filter)。本文将从实际出发,向你介绍NestJS过滤器的基本概…...

ubuntu 守护进程 supervisor

# 安装 apt-get install supervisor# 检查 echo_supervisord_conf# 查看配置文件所在位置 # [include] # files /etc/supervisor/conf.d/*.conf ps -ef | grep supervisorcd /etc/supervisor/conf.d/lscat frp.conf[program:frp] command /data/work/frp/frpc -c /data/work/…...

SparkStreaming_window_sparksql_reids

1.5 window 滚动窗口滑动窗口 window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚合起来执行计算操作,然后生成的RDD,会…...

爬虫工作量由小到大的思维转变---<第二十四章 Scrapy的`统计数据`收集stats collection ---12月26日补>

前言: 前两篇是讲的数据诊断分析,还有一篇深挖解决内存泄漏的文章,目前我还没整理汇编出来;但是,想到分析问题的时候,忽然觉得爬虫的数据统计好像也挺重要;于是,心血来潮准备来插一篇这个------让大家对日常scrapy爬的数据,做到心里有数!不必自己去搅破脑汁捣腾日志,敲计算器了…...

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…...

.NetCore NPOI 读取excel内容及单元格内图片

由于数据方提供的数据在excel文件中不止有文字内容还包含图片信息,于是编写相关测试代码,读取excel文件内容及图片信息. 本文使用的是 NPOI-2.6.2 版本,此版本持.Net4.7.2;.NetStandard2.0;.NetStandard2.1;.Net6.0。 测试文档内容&#xf…...

TCP/UDP协议

1. 请解释TCP和UDP的主要区别。 TCP和UDP都是位于传输层的协议,具有不同的特点和应用场景。以下是它们的主要区别: 连接方式:TCP是面向连接的协议,这意味着在数据传输之前需要先建立连接。这通常通过三次握手来建立连接&#xff…...

3D 渲染如何帮助电商促进销售?

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 3D 渲染图像因其高转化率而成为亚马逊卖家的最新趋势。它是电子商务平…...

使用栈求表达式的值【数据结构】

中缀表达式转后缀表达式 转换流程: 初始化一个运算符栈。自左向右扫描中缀表达式,当扫描到操作数时直接连接到后缀表达式上。当扫描到操作符时,和运算符栈栈顶的操作符进行比较。如果比栈顶运算符高,则入栈。如果比栈顶运算符低…...

{MySQL}索引事务和JDBC

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、索引1.1索引是什么1.2作用1.3代码 二、事务2.1什么是事务2.2使用 三.JDBC总结 前言 接着上次,继续讲下MySQL 提示:以下是本篇文章正…...

Qt designer界面和所有组件功能的详细介绍(全!!!)

PyQt5和Qt designer的详细安装教程:https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501 目录 1. 界面介绍2. Widget Box 常用组件2.1 Layouts(布局)2.2 Spacers(间隔器)2.3 Item V…...

mysql_存储过程

举例子 createdefiner root% procedure insert_batch_test(IN START int(10), IN max_num int(10)) BEGINDECLAREi INT DEFAULT 0;SET autocommit 0;REPEATSET i i 1;INSERT INTO test (std, score)VALUES (CEILING(RAND() * 10 100), CEILING(RAND() * 50 50));UNTIL i …...

uboot学习及内核更换_incomplete

官方文档 在前面 文章目录 uboot常见命令学习环境变量网络控制台uboot标准启动其他 升级uboot或内核bin和uimg以及booti和bootm的区别制作uImage更换内核更换uboot后续计划 uboot常见命令学习 环境变量 Environment Variables环境变量 autostart 如果值为yes,则会…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...