您现在的位置是:网站首页> 开发积累
开源库收集
- 开发积累
- 2024-08-11
- 743人已阅读
开源库收集
DouyinLiveRecorder可循环值守和多人录制的直播录制软件
HyperLPR3车牌识别-Android-SDK光速部署与使用
OCR开源库
Tesseract和EasyOCR在实际识别效果方面表现较好,另外百度飞桨OCR。
1.Tesseract:Tesseract是一个成熟的OCR引擎,由Google维护。它经过多年的发展,具有强大的识别能力和广泛的语言支持。Tesseract在处理清晰、高质量的图像时表现出色,并在大量文档和图像数据集上进行了广泛的训练和优化。对于标准字体和规范布局的文本,Tesseract通常能够提供准确的识别结果。安装说明路径:https://tesseract-ocr.github.io/tessdoc/Installation.html,开源地址:https://github.com/tesseract-ocr/tesseract
2.EasyOCR:EasyOCR是一个基于深度学习的OCR库,它使用了预训练的模型和深度神经网络来实现文字识别。EasyOCR在多个语言中表现出色,包括中文和英文。它具有良好的准确性和较高的识别速度,特别适用于处理复杂字体、低质量图像或倾斜文本等情况。
需要注意的是,OCR的实际识别效果受到多种因素的影响,包括图像质量、字体样式、布局复杂性和语言特征等。因此,无法简单地确定哪个库在所有情况下都具有最佳效果。在选择OCR库时,建议根据具体需求进行评估和测试,选择适合特定应用场景的库,并进行必要的调优和优化。
以上两款效果都不好,建议使用后面的Umi-OCR,或使用Python的PaddleOCR免费库
2.C#使用Tesseract
using System;
using System.Drawing;
using Tesseract;
class Program
{
static void Main(string[] args)
{
// 设置 Tesseract 引擎的数据路径,这里假设你已经下载了对应的语言数据文件
string tessDataPath = @"C:\tesseract\tessdata"; // 替换为你的数据文件路径
// 创建 Tesseract 引擎实例
using (var engine = new TesseractEngine(tessDataPath, "eng", EngineMode.Default))
{
// 加载要识别的图像
using (var image = new Bitmap(@"C:\path\to\your\image.jpg")) // 替换为你的图像路径
{
// 将图像加载到 Tesseract 引擎中
using (var page = engine.Process(image))
{
// 获取识别结果
string result = page.GetText();
// 输出识别结果
Console.WriteLine(result);
}
}
}
}
}
C#使用EasyOCR
EasyOCR 是一个基于深度学习的OCR库,它没有官方的 C# 版本,但你可以使用 Python 的 EasyOCR 库,并通过 C# 调用 Python 脚本来实现 EasyOCR 的文字识别。下面是一个使用 C# 调用 Python 脚本进行 EasyOCR 文字识别的示例:
首先,确保你已经安装了 Python 和 EasyOCR 库。你可以使用以下命令在命令行中安装 EasyOCR:
pip install easyocr
```
创建一个 Python 脚本文件(例如,easyocr_script.py),并编写以下内容:
import easyocr
def perform_ocr(image_path):
# 创建 EasyOCR 实例
reader = easyocr.Reader(['en', 'zh'], gpu=False) # 替换为你需要的语言列表
# 使用 EasyOCR 进行文字识别
result = reader.readtext(image_path)
return result
```
该脚本创建了一个 `perform_ocr` 函数,接受一个图像路径作为参数,并返回识别结果。
在 C# 项目中,使用 Process 类来调用 Python 脚本。确保你的项目引用了 System.Diagnostics 命名空间。然后,编写以下代码:
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// 图像路径
string imagePath = @"C:\path\to\your\image.jpg"; // 替换为你的图像路径
// 调用 Python 脚本进行 EasyOCR 文字识别
string pythonScriptPath = @"C:\path\to\your\easyocr_script.py"; // 替换为你的 Python 脚本路径
string arguments = $"\"{pythonScriptPath}\" {imagePath}";
ProcessStartInfo start = new ProcessStartInfo
{
FileName = "python",
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.WriteLine(result);
}
}
}
}
```
在上述代码中,你需要替换以下部分以适应你的实际情况:
- `imagePath`:要识别的图像路径。
- `pythonScriptPath`:Python 脚本文件的路径。
这段代码使用 `Process` 类启动一个 Python 进程,并将 EasyOCR 脚本文件和图像路径作为参数传递给脚本。然后,将 Python 脚本的输出读取并打印出来。
请确保你已经安装了合适版本的 Python,并正确设置了 Python 的环境变量。这样,你就可以使用上述代码来调用 EasyOCR 进行文字识别。记得根据你的需求进行适当的定制和扩展,比如指定其他语言、处理识别结果等。
百度飞浆使用,开源地址
以下是一个使用C#调用PaddleOCR的简单示例:
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 配置模型文件路径和图像文件路径
string modelPath = "path/to/paddleocr/model/directory";
string imagePath = "path/to/image/file";
// 发送POST请求
string apiUrl = "http://localhost:8866/predict/ocr_system";
string responseJson = await SendPostRequest(apiUrl, modelPath, imagePath);
// 解析响应
Console.WriteLine(responseJson);
}
static async Task<string> SendPostRequest(string apiUrl, string modelPath, string imagePath)
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), apiUrl))
{
// 设置请求头
request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
// 构建请求数据
string jsonContent = $"{{\"images\": [\"{Convert.ToBase64String(File.ReadAllBytes(imagePath))}\"], \"use_gpu\": false, \"use_tensorrt\": false, \"det_model_dir\": \"{modelPath}\", \"rec_model_dir\": \"{modelPath}\"}}";
// 发送请求
request.Content = new StringContent(jsonContent);
var stopwatch = new Stopwatch();
stopwatch.Start();
var response = await httpClient.SendAsync(request);
stopwatch.Stop();
Console.WriteLine($"Request time: {stopwatch.ElapsedMilliseconds} ms");
// 处理响应
if (response.StatusCode == HttpStatusCode.OK)
{
return await response.Content.ReadAsStringAsync();
}
else
{
throw new Exception($"Request failed with status code {response.StatusCode}");
}
}
}
}
}
请确保将modelPath替换为您的PaddleOCR模型的实际路径,将imagePath替换为要识别的图像文件的实际路径。此外,还需要将apiUrl设置为适当的PaddleOCR API端点。
请注意,此示例假定您已经正确安装了HttpClient和相关依赖项,并且您的PaddleOCR服务正在本地运行,并监听端口8866。如果您的环境与此不同,您需要相应地调整代码。
此示例使用HttpClient来发送POST请求,并将图像文件转换为Base64编码的字符串作为请求体的一部分。然后,它等待响应并返回响应的JSON字符串。
百度飞浆安装使用
PaddleOCR是一个基于PaddlePaddle深度学习框架的开源OCR(光学字符识别)工具。它提供了端到端的OCR解决方案,并支持多种OCR任务,包括文本检测、文本识别、文本方向检测等。下面是PaddleOCR的安装和使用过程的详细介绍:
1. 安装依赖
首先,确保您的系统满足以下依赖项:
Python 3.6或更高版本
PaddlePaddle 2.0或更高版本
PaddleClas(可选,用于文本方向检测任务)
PaddleHub 2.0或更高版本(用于模型的快速加载和调用)
您可以使用以下命令安装PaddlePaddle和PaddleHub:
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install paddlehub -i https://mirror.baidu.com/pypi/simple
如果您需要进行文本方向检测任务,可以使用以下命令安装PaddleClas:
pip install paddleclas -i https://mirror.baidu.com/pypi/simple
2. 下载模型
PaddleOCR提供了多个预训练模型,您可以根据自己的需求选择下载合适的模型。模型可以通过以下命令进行下载:
hub install paddleocr==2.3.0
此命令将下载PaddleOCR的2.3.0版本模型。
3. 使用PaddleOCR
安装和模型下载完成后,您可以使用PaddleOCR进行OCR任务。以下是一个简单的示例代码:
import paddlehub as hub
# 加载模型
ocr = hub.Module(name='paddleocr')
# 读取图像
image_path = 'path/to/your/image.jpg'
image = hub.Module(name='cv2').read_img(image_path)
# 进行OCR识别
result = ocr.recognize_text(images=[image], use_gpu=False, visualization=True)
# 打印识别结果
for line in result[0]['data']:
print(line['text'])
在这个示例中,我们首先通过hub.Module加载PaddleOCR模型。然后,我们使用cv2模块读取图像,并调用ocr.recognize_text方法进行OCR识别。最后,我们打印识别结果。
请确保将image_path替换为您实际的图像路径。
这只是PaddleOCR的基本使用方法。您还可以根据需要进行更多高级配置,例如设置识别语言、调整识别阈值、指定模型路径等。您可以查阅PaddleOCR的文档以获取更多详细信息和示例代码。
希望这些信息对您有所帮助,祝您使用PaddleOCR顺利!
车牌识别库
以下是几个开源免费且功能强大的多车牌识别库:
1.OpenALPR(https://github.com/openalpr/openalpr):OpenALPR是一个流行的开源车牌识别库,它提供了车牌检测和识别的功能。它支持多种国家和地区的车牌识别,并且具有高度准确性和可靠性。
2。EasyPR(https://github.com/liuruoze/EasyPR):EasyPR是一个基于OpenCV和SVM的开源车牌识别库。它是用C++编写的,支持中文和英文车牌的识别。EasyPR提供了简单易用的接口和示例代码。
3.HyperLPR(https://github.com/zeusees/HyperLPR):HyperLPR是一个基于深度学习的车牌识别库,使用Python编写。它采用了端到端的车牌识别方法,具有较高的准确性和鲁棒性。HyperLPR支持中文和英文车牌的识别,并且可以处理多车道的识别任务。
4.ANPR(https://github.com/DoubangoTelecom/ultimateALPR):ANPR(Automatic Number Plate Recognition)是一个功能强大的开源车牌识别库,由Doubango Telecom开发。它基于深度学习和计算机视觉技术,提供了准确和高性能的车牌识别能力。ANPR支持多种车牌格式和国家/地区的识别。
这些车牌识别库都具有不同的特点和适用场景,您可以根据自己的需求和项目要求选择适合的库进行使用。请注意,使用这些库可能需要您具备一定的编程和计算机视觉知识。在使用时,请遵循每个库的使用指南和相关许可证要求。
在四个提到的开源车牌识别库中,HyperLPR对中国车牌的支持较好。HyperLPR是一个基于深度学习的车牌识别库,专注于中文车牌的识别。它经过了大量的训练和优化,具有较高的准确性和鲁棒性,能够处理各种类型的中国车牌,包括普通车牌、新能源车牌等。
HyperLPR使用Python编写,提供了简单易用的接口,可以方便地集成到您的项目中。它还支持多车道的识别任务,适用于需要处理复杂交通场景的应用。
请注意,车牌识别的准确性受多种因素影响,包括图像质量、光照条件、车牌类型等。因此,在实际使用中,您可能需要针对具体场景进行参数调整和优化,以获得最佳的识别效果。
Hyperlpr是一个基于深度学习的车牌识别库,用于识别和提取图像中的车牌信息。以下是在Python环境中安装和使用HyperLPR的详细步骤:
安装步骤:
确保你的系统已经安装了Python和pip包管理器。
打开终端或命令提示符,执行以下命令来安装HyperLPR:
pip install hyperlpr
```
安装完成后,你可以开始使用HyperLPR。
使用步骤:
1.导入HyperLPR库:
import hyperlpr as pr
```
2.使用pr.plate_recognition函数来识别图像中的车牌:
image_path = 'path/to/your/image.jpg' # 替换为你的图像路径
results = pr.plate_recognition(image_path)
```
注意:确保替换`image_path`为你要识别的实际图像的路径。
3.plate_recognition函数将返回一个包含识别结果的列表。你可以遍历该列表以获取每个车牌的信息。
for result in results:
plate_num = result[0] # 车牌号码
confidence = result[1] # 置信度
location = result[2] # 车牌位置信息
print(f"车牌号码: {plate_num},置信度: {confidence},位置: {location}")
```
你可以根据需要自行处理或使用这些信息。
这样,你就可以使用HyperLPR来识别图像中的车牌了。请确保图像中的车牌清晰可见,以获得更好的识别结果。如果你遇到任何问题,可以查阅HyperLPR的文档或提问相关的技术支持。
官方文档
一键安装
python -m pip install hyperlpr3
支持python3, 支持Windows Mac Linux 树莓派等。
720p cpu real-time (st on MBP r15 2.2GHz haswell).
快速体验
# 使用命令行测试 - 图像url地址
lpr3 sample -src https://koss.iyong.com/swift/v1/iyong_public/iyong_2596631159095872/image/20190221/1550713902741045679.jpg
# 使用命令行测试 - 本地图像路径
lpr3 sample -src images/test_img.jpg -det high
快速上手
# 导入opencv库
import cv2
# 导入依赖包
import hyperlpr3 as lpr3
# 实例化识别对象
catcher = lpr3.LicensePlateCatcher()
# 读取图片
image = cv2.imread("images/test_img.jpg")
# 识别结果
print(catcher(image))
启动WebApi服务
# 启动服务
lpr3 rest --port 8715 --host 0.0.0.0
启动后可打开SwaggerUI的路径:http://localhost:8715/api/v1/docs 查看和测试在线识别API服务:
点击查看 HyperLPR3车牌识别-五分钟搞定: 中文车牌识别光速部署与使用
简介
HyperLPR在2023年初已经更新到了v3的版本,该版本与先前的版本一样都是用于识别中文车牌的开源图像算法项目,最新的版本的源码可从github中提取:https://github.com/szad670401/HyperLPR
支持多种类型车牌
快速安装
使用Python平台可以直接使用pip进行安装,方便快捷:
python -m pip install hyperlpr3
快速测试
安装成功后,可以使用命令行工具对本地图像或在线url进行快速测试,这边我们使用一张新能源的车辆照片进行测试:
lpr3 sample -src https://image.xcar.com.cn/attachments/a/day_170125/2017012516_5cb21721d2f35a0f2984HCOTsEuQ6jwg.jpg
测试结果如下:
----------------------------------------
2023-02-28 11:27:28.658 | INFO | hyperlpr3.command.sample:sample:70 - 共检测到车牌: 1
2023-02-28 11:27:28.659 | SUCCESS | hyperlpr3.command.sample:sample:73 - [绿牌新能源]沪AD07979 0.9999245405197144 [582, 1306, 992, 1431]
启动在线API服务
如果您有部署到云端去调用的需求,HyperLPR3中已经内置了启动WebApi服务的功能,支持一键启动,且自带SwaggerUI文档页面,相对方便友好:
# 启动服务 workers为进程数量,请根据需求进行调节
lpr3 rest --port 8715 --host 0.0.0.0 --workers 1
启动后可打开SwaggerUI的路径:http://localhost:8715/api/v1/docs 查看和测试在线识别API服务:
启动后即可对车牌识别Api进行使用
在Python代码中快速上手
如果您需要在自己的Python工程中引入HyperLPR3进行车牌识别功能的开发,那您可以使用如下代码进行调用:
# 导入opencv库
import cv2
# 导入依赖包
import hyperlpr3 as lpr3
# 实例化识别对象
catcher = lpr3.LicensePlateCatcher()
# 读取图片
image = cv2.imread("images/test_img.jpg")
# 识别结果
print(catcher(image))
仅需要3行代码即可完成对HyperLPR3库的调用
识别并绘制结果
返回的数据解析非常简单,参考以下代码内容即可,中文字体可在在此下载:https://github.com/szad670401/HyperLPR/blob/master/resource/font/platech.ttf?raw=true
# 导入cv相关库
import cv2
import numpy as np
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
# 导入依赖包
import hyperlpr3 as lpr3
def draw_plate_on_image(img, box, text, font):
x1, y1, x2, y2 = box
cv2.rectangle(img, (x1, y1), (x2, y2), (139, 139, 102), 2, cv2.LINE_AA)
cv2.rectangle(img, (x1, y1 - 20), (x2, y1), (139, 139, 102), -1)
data = Image.fromarray(img)
draw = ImageDraw.Draw(data)
draw.text((x1 + 1, y1 - 18), text, (255, 255, 255), font=font)
res = np.asarray(data)
return res
# 中文字体加载
font_ch = ImageFont.truetype("platech.ttf", 20, 0)
# 实例化识别对象
catcher = lpr3.LicensePlateCatcher(detect_level=lpr3.DETECT_LEVEL_HIGH)
# 读取图片
image = cv2.imread("image.jpg")
# 执行识别算法
results = catcher(image)
for code, confidence, type_idx, box in results:
# 解析数据并绘制
text = f"{code} - {confidence:.2f}"
image = draw_plate_on_image(image, box, text, font=font_ch)
# 显示检测结果
cv2.imshow("w", image)
cv2.waitKey(0)
绘制结果如下:
帮助
以上为HyperLPR3的Python端五分钟快速上手,需要获取其他的帮助,请移步到项目地址:https://github.com/szad670401/HyperLPR
人脸识别库
以下是几个开源可商用的人脸采集与识别库:
1.OpenCV:OpenCV 是一个流行的计算机视觉库,提供了广泛的图像处理和计算机视觉算法。它包含了人脸检测、特征提取和人脸识别等功能。OpenCV 使用 C++ 编写,但也提供了许多其他编程语言的接口,如 Python、Java 等。
2.Dlib:Dlib 是一个强大的 C++ 库,提供了机器学习算法和工具,包括人脸检测和人脸识别。它使用基于模板的机器学习方法,支持训练自定义的人脸识别模型。Dlib 还提供了 Python 接口,方便使用 Python 进行人脸采集和识别。
3.FaceNet:FaceNet 是由 Google 团队开发的人脸识别系统,它使用深度学习模型进行人脸特征提取和识别。FaceNet 的模型基于卷积神经网络(CNN)和三元组损失函数进行训练,能够生成具有高度可区分性的人脸特征向量。FaceNet 的代码和预训练模型可在 GitHub 上找到。
4.InsightFace:InsightFace 是一个用于人脸分析和识别的开源库,基于 MXNet 深度学习框架。它提供了多种人脸识别模型,包括 ArcFace、CosFace 等,这些模型在公开的人脸识别数据集上表现出色。InsightFace 还提供了训练和部署人脸识别模型的工具和示例代码。
5.OpenBR:OpenBR 是一个面向边界的人脸识别库,提供了一系列用于人脸图像处理和识别的算法。它支持多种人脸检测和特征提取算法,并提供了基于局部二值模式(LBP)和 Gabor 滤波器的人脸识别功能。OpenBR 也提供了 Python 接口,方便在 Python 环境中使用。
这些库都是开源的,并且可以用于商业目的。然而,对于商业应用,你应该仔细阅读每个库的许可证,确保你满足其使用要求。此外,这些库通常需要一定程度的编程知识和技能才能正确使用和集成到你的应用程序中。
强大的DLib(着急的同学直接跳过)
做人脸识别的同学,对鼎鼎大名的DLib和Face_recognition库一定不会陌生。通过它俩,所长可以在30行以内利用python实现一个人脸识别系统,可以轻松提取人脸68关键点实时检测。而且人脸检测率、识别准确率极高。Face_recognition依赖DLib
网上各种安装方法,大部分都是从源码安装的,很多文章其实代入了特定的环境,在你的机器上不一定能成功,会弹出各种诡异的错误。官方给出的在Windows 10系统下从源码安装dlib的步骤如下:
1)安装Visual Studio 2015或更高版本,并确保在安装期间选择C++开发工具。
2)安装CMake,并将其添加到系统路径中。
3)安装Boost C++库,可以通过官方网站下载二进制文件,或者从源代码构建。
4)安装Python 3,并确保将其添加到系统路径中。
5)下载dlib源码并解压缩。
6)在命令提示符或PowerShell中导航到解压缩后的dlib目录。
7)运行以下命令:python setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA。其中,--yes USE_AVX_INSTRUCTIONS指定使用AVX指令集进行加速,--no DLIB_USE_CUDA禁用CUDA加速。
看上去简单?但是不同的环境上述依赖库的版本打不相同,你想一次性安装成功基本上是小概率事件
pip install cmake
pip install boost
pip install dlib
接下来给大家分享一个非常简单的python环境安装DLIB方法,100%成功。
仅需3步,完成DLIB安装
STEP 1:安装anconda python 3.9(安装过的直接学下一步)
直接从清华源下载。Windows64位exe安装方法如下:
百度搜索清华源:
点击anaconda:
点击archive:
windows选择这个文件:
Anaconda 是一个包含多种数据科学和机器学习工具的开源发行版,其中包括 Python 编程语言。Python 是一种高级编程语言,常用于数据分析、机器学习、人工智能等领域。在安装 Anaconda 时,会自动安装 Python 解释器及其许多常用的第三方库和工具,使用户可以方便地开始使用 Python 进行数据科学和机器学习的开发。此外,Anaconda 还提供了一个虚拟环境管理器,允许用户轻松创建和管理多个 Python 环境,每个环境中可以使用不同版本的 Python 和第三方库。因此,Anaconda 和 Python 之间的关系是,Anaconda 包含 Python 和许多 Python 的库和工具,并提供了虚拟环境管理器,使得 Python 的使用更加方便和灵活。
直接根据提示一步一步安装就好了。注意如果不会配置环境变量的同学,可以在安装前可以选择添加环境变量(勾选Add Anaconda3 to my PATH environment variable), 就是下图第一个选项:
这样做的好处是你的CMD命令行python直接会被配制成刚才安装的这个环境。但是会覆盖掉之前安装的python环境!介意的同学不要勾选!!!理论上anconda python >=3.7都可以使用这个方法安装Dlib。
STEP 2:配置conda的国内源(配置过的同学直接下一步)。
刚才勾选了Add Anaconda3 to my PATH environment variable 选项的同学。点击桌面的搜索框,输入CMD,打开命令行(没有勾选的同学,输入“Anaconda Prompt”)。这一步可以直接百度,非常简单。对网速有信息的同学可以直接跳过。
STEP 3:一行命令,安装DLib。
直接在刚才的CMD输入:conda install -c conda-forge dlib。
耐心等待它为你准备环境。环境准备好之后,它会提示让你选是否安装,在CMD窗口输入一个y即
安装时长和你的网速有很大关系。如果你的网络速度太慢,有时候超会时。超时了重新执行:conda install -c conda-forge dlib。直到成功为止。所长的建议是在安装时电脑更换一个快些的热点。
验证dlib安装
直接在命令行输入:python回车,进入python环境。然后输入:import dlib 回车,没有任何报错和输出就是安装完毕了。特征点检测结果,还是很准的:
dlib库的使用示例
人脸检测
可以使用dlib自带的人脸检测器来检测图片中的人脸。示例代码如下:
import dlib
# 加载HOG人脸检测器模型
detector = dlib.get_frontal_face_detector()
# 加载图片并进行预处理
img = dlib.load_rgb_image('test.jpg')
gray = dlib.rgb_to_gray(img)
# 进行人脸检测
dets = detector(gray, 1)
for i, d in enumerate(dets):
print("检测到人脸数目: {}".format(len(dets)))
print("检测到 {}: Left: {} Top: {} Right: {} Bottom: {} 可信度: {}".format(i, d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom(), d.confidence))
这段代码首先加载HOG人脸检测器模型,然后加载图片并转换为灰度图,最后使用detector对象对图片进行人脸检测,并输出检测到的人脸位置和可信度。
人脸识别
使用dlib的人脸识别功能可以对人脸进行特征提取和比对。示例代码如下:
import dlib
import numpy as np
import cv2
# 加载HOG人脸检测器模型
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
facerec = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')
# 加载图片并进行预处理
img1 = cv2.imread('test1.jpg')
img2 = cv2.imread('test2.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 进行人脸检测并提取特征
dets1 = detector(gray1, 1)
for i, d in enumerate(dets1):
shape1 = sp(gray1, d)
face_descriptor1 = facerec.compute_face_descriptor(gray1, shape1)
print("Face descriptor1 shape: ", face_descriptor1.shape)
print("Face descriptor1 values: ", face_descriptor1)
print()
dets2 = detector(gray2, 1)
for i, d in enumerate(dets2):
shape2 = sp(gray2, d)
face_descriptor2 = facerec.compute_face_descriptor(gray2, shape2)
print("Face descriptor2 shape: ", face_descriptor2.shape)
print("Face descriptor2 values: ", face_descriptor2)
print()
# 进行人脸比对
dist = dlib.face_recognition_distance(face_descriptor1, face_descriptor2)
print("Face distance: ", dist)
这段代码首先加载了一个HOG人脸检测器模型,然后加载了一张图片并对其进行预处理。接下来,我们使用detector对象对图片进行人脸检测,将检测到的人脸框出来,并显示结果。
首先找到想对应的whl文件,去官网搜
要注意了,这里的cp39是python3.9的意思,自己寻找相对应的版本
然后pip install 文件名
下载人脸模型
基于mpv的mplayer
ffmpeg
opencv
虚拟摄像头
有一些开源项目提供了在Windows平台上创建虚拟摄像头的代码。以下是其中几个比较流行的项目:
OBS Studio:OBS Studio 是一款功能强大的开源视频录制和直播软件,它可以创建虚拟摄像头设备供其他应用程序使用。你可以在 OBS Studio 的 GitHub 页面上找到源代码和详细的文档。
DroidCam:DroidCam 是一个开源项目,它允许你使用 Android 手机作为虚拟摄像头。它提供了一个 Windows 应用程序和相关的源代码,可以将你的 Android 手机摄像头的视频流发送到 Windows 平台上的应用程序。
ManyCam:ManyCam 是一款流行的虚拟摄像头软件,它允许用户在 Windows 平台上创建多个虚拟摄像头,并且提供了各种视频效果和过滤器。ManyCam 并没有完全开源,但是它的开发者提供了一个 SDK,可以用于在你的应用程序中集成虚拟摄像头功能。
obs-websocket,外部控制接口
obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.
Here's a list of available language APIs for obs-websocket:
Python 3.7+ (Asyncio): simpleobsws by IRLToolkit
Python 3.10+ (Non-Asyncio): obsws-python by aatikturk and onyx-and-iris
Rust: obws by dnaka91
Godot 4.0.x: obs-websocket-gd by you-win
Javascript (Node and web): obs-websocket-js by OBS Websocket Community
C (uses obs-websocket-js): v8-libwebsocket-obs-websocket
Go: goobs by andreykaipov
Dart/Flutter (can target all supported platforms): obs_websocket by faithoflifedev
Java: obs-websocket-java by OBS Websocket Community
python控制obs实现无缝切换场景!obs-websocket-py
OBS 支持通过调用 API 来实现人工配置。
实现这一目的需要以下步骤:
下载并安装 OBS
在 OBS 中启用远程控制功能。这可以在 "设置" > "远程控制" 中完成。
使用适当的编程语言编写代码来调用 OBS 的 API。根据您使用的编程语言和平台,可以使用不同的库来实现这一目的。例如,您可以使用 obs-websocket-py 库在 Python 中调用 OBS 的 API。
使用您编写的代码来控制 OBS,例如添加和删除源,更改音量等。
OBS-websocket客户端SDK
.NET的开发包:https://github.com/BarRaider/obs-websocket-dotnet
Go的开发包:https://github.com/christopher-dG/go-obs-websocket
Java的开发包:https://github.com/obs-websocket-community-projects/obs-websocket-java
Dart开发包:https://github.com/Kounex/obs_blade
JS开发包:https://github.com/obs-websocket-community-projects/obs-websocket-js
Python开发包:https://github.com/Elektordi/obs-websocket-py
Rust开发包:https://github.com/grigio/obs-cmd
Vue开发包:https://github.com/t2t2/obs-tablet-remote
obs-websocket-dotnet 是一个用于 .NET 平台的 OBS Studio WebSocket 插件的客户端库。通过这个库,你可以在 .NET 应用程序中与 OBS Studio 进行交互,实现以下功能:
- 启动和停止录制或推流
- 切换场景
- 控制音频源的静音状态和音量
- 获取当前场景、音频源、转场等信息
- 接收 OBS 事件,如场景切换、录制开始/停止等
使用 obs-websocket-dotnet,你需要:
- 在 OBS Studio 中安装 obs-websocket 插件
- 在你的 .NET 项目中通过 NuGet 安装 obs-websocket-dotnet 包
- 创建 ObsWebSocket 对象,连接到 OBS Studio
- 调用 ObsWebSocket 对象提供的方法与 OBS Studio 交互
下面是一个简单的 C# 示例:
using OBSWebsocketDotNet; using OBSWebsocketDotNet.Types; var obs = new ObsWebSocket(); obs.Connect("ws://localhost:4455", "password"); // 获取当前场景名称 var currentScene = obs.GetCurrentScene(); Console.WriteLine($"Current scene: {currentScene.Name}"); // 切换到另一个场景 obs.SetCurrentScene("Scene2");
总的来说,obs-websocket-dotnet 为 .NET 开发者提供了一种方便的方式来与 OBS Studio 集成,实现录制、推流和场景管理的自动化
控制例子
使用obs-websocket-dotnet控制特定场景中的媒体源显示和隐藏是完全可行的。以下是如何实现这一功能的步骤和示例代码:
首先,确保你已经安装了obs-websocket-dotnet库,并成功连接到OBS Studio。
使用SetSceneItemProperties方法来控制媒体源的可见性。
以下是一个示例代码:
using OBSWebsocketDotNet;
using OBSWebsocketDotNet.Types;
public class OBSController
{
private OBSWebsocket _obs;
public OBSController()
{
_obs = new OBSWebsocket();
_obs.Connect("ws://localhost:4444", "password"); // 替换为你的WebSocket URL和密码
}
public void ToggleMediaVisibility(string sceneName, string sourceName, bool isVisible)
{
try
{
var sceneItemId = GetSceneItemId(sceneName, sourceName);
if (sceneItemId != -1)
{
var setSceneItemPropertiesRequest = new SetSceneItemPropertiesRequest
{
SceneName = sceneName,
SceneItemId = sceneItemId,
Visible = isVisible
};
_obs.SendRequest("SetSceneItemProperties", setSceneItemPropertiesRequest);
Console.WriteLine($"设置 {sourceName} 在场景 {sceneName} 中的可见性为: {isVisible}");
}
else
{
Console.WriteLine($"未找到源 {sourceName} 在场景 {sceneName} 中");
}
}
catch (Exception ex)
{
Console.WriteLine($"设置可见性时出错: {ex.Message}");
}
}
private int GetSceneItemId(string sceneName, string sourceName)
{
var sceneItemList = _obs.GetSceneItemList(sceneName);
var sceneItem = sceneItemList.FirstOrDefault(item => item.SourceName == sourceName);
return sceneItem?.ItemId ?? -1;
}
}
使用方法:
var obsController = new OBSController();
// 显示媒体源
obsController.ToggleMediaVisibility("场景名称", "媒体源名称", true);
// 隐藏媒体源
obsController.ToggleMediaVisibility("场景名称", "媒体源名称", false);
这个示例中:
OBSController 类初始化时连接到OBS Studio。
ToggleMediaVisibility 方法接受三个参数:场景名称、源名称和是否可见。
GetSceneItemId 方法用于获取特定源在场景中的ID。
使用 SetSceneItemProperties 请求来更改源的可见性。
注意事项:
确保提供正确的场景名称和源名称。
错误处理很重要,因为网络操作可能会失败。
这个示例假设你使用的是较新版本的obs-websocket。如果使用旧版本,可能需要稍微调整代码。
通过这种方法,你可以轻松控制OBS Studio中特定场景的媒体源的显示和隐藏。
我可以为你提供如何使用obs-websocket-dotnet控制指定场景中媒体源的播放和停止的示例。这个功能主要通过控制媒体源的属性来实现。以下是一个实现这一功能的示例代码:
using OBSWebsocketDotNet;
using OBSWebsocketDotNet.Types;
using Newtonsoft.Json.Linq;
public class OBSMediaController
{
private OBSWebsocket _obs;
public OBSMediaController()
{
_obs = new OBSWebsocket();
_obs.Connect("ws://localhost:4444", "password"); // 替换为你的WebSocket URL和密码
}
public void PlayMedia(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY");
}
public void StopMedia(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP");
}
private void ControlMedia(string sceneName, string sourceName, string action)
{
try
{
var sceneItemId = GetSceneItemId(sceneName, sourceName);
if (sceneItemId != -1)
{
var request = new JObject
{
{ "inputName", sourceName },
{ "mediaAction", action }
};
_obs.SendRequest("TriggerMediaInputAction", request);
Console.WriteLine($"对 {sourceName} 在场景 {sceneName} 中执行操作: {action}");
}
else
{
Console.WriteLine($"未找到源 {sourceName} 在场景 {sceneName} 中");
}
}
catch (Exception ex)
{
Console.WriteLine($"控制媒体时出错: {ex.Message}");
}
}
private int GetSceneItemId(string sceneName, string sourceName)
{
var sceneItemList = _obs.GetSceneItemList(sceneName);
var sceneItem = sceneItemList.FirstOrDefault(item => item.SourceName == sourceName);
return sceneItem?.ItemId ?? -1;
}
}
使用方法:
var obsMediaController = new OBSMediaController();
// 播放媒体
obsMediaController.PlayMedia("场景名称", "媒体源名称");
// 停止媒体
obsMediaController.StopMedia("场景名称", "媒体源名称");
这个示例中:
OBSMediaController 类在初始化时连接到OBS Studio。
PlayMedia 和 StopMedia 方法分别用于播放和停止指定场景中的媒体源。
ControlMedia 是一个私有方法,用于发送实际的控制命令。它使用 TriggerMediaInputAction 请求来控制媒体源。
GetSceneItemId 方法用于获取特定源在场景中的ID。
我们使用 OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY 和 OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP 作为媒体控制动作。
注意事项:
确保提供正确的场景名称和源名称。
错误处理很重要,因为网络操作可能会失败。
这个示例假设你使用的是较新版本的obs-websocket。如果使用旧版本,可能需要稍微调整代码。
媒体源必须是支持播放控当然,我来继续补充一些重要的信息和功能:
媒体源必须是支持播放控制的类型,如视频或音频文件。不是所有的源都支持这些操作。
除了播放和停止,你还可以添加更多的媒体控制功能,比如暂停、重启、前进和后退。这里是一些额外的方法你可以添加到 OBSMediaController 类中:
public void PauseMedia(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE");
}
public void RestartMedia(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART");
}
public void NextFrame(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT");
}
public void PreviousFrame(string sceneName, string sourceName)
{
ControlMedia(sceneName, sourceName, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS");
}
你可能还想添加一个方法来获取媒体源的当前状态:
public string GetMediaState(string sourceName)
{
try
{
var response = _obs.SendRequest("GetMediaInputStatus", new JObject { { "inputName", sourceName } });
return response["mediaState"].ToString();
}
catch (Exception ex)
{
Console.WriteLine($"获取媒体状态时出错: {ex.Message}");
return "unknown";
}
}
对于更复杂的控制,你可能需要设置媒体源的时间:
public void SetMediaTime(string sourceName, int milliseconds)
{
try
{
var request = new JObject
{
{ "inputName", sourceName },
{ "mediaTime", milliseconds }
};
_obs.SendRequest("SetMediaInputCursor", request);
Console.WriteLine($"设置 {sourceName} 的时间为 {milliseconds} 毫秒");
}
catch (Exception ex)
{
Console.WriteLine($"设置媒体时间时出错: {ex.Message}");
}
}
你可能还想添加事件监听器来响应媒体状态的变化:
public void SetupMediaStateChangeListener()
{
_obs.MediaInputPlaybackStarted += (sender, e) =>
{
Console.WriteLine($"媒体源 {e.InputName} 开始播放");
};
_obs.MediaInputPlaybackEnded += (sender, e) =>
{
Console.WriteLine($"媒体源 {e.InputName} 播放结束");
};
}
最后,记得在不再需要时断开连接:
public void Disconnect()
{
_obs.Disconnect();
}
使用这些额外的方法,你可以更全面地控制OBS中的媒体源。记住,始终要进行适当的错误处理,并确保你的应用程序能够优雅地处理连接问题或OBS Studio未运行的情况。
此外,根据你的具体需求,你可能还需要考虑添加更多的功能,如调整音量、更改播放速度等。OBS WebSocket协议提供了许多可能性,你可以根据需要进一步扩展这个控制器类。
DouyinLiveRecorder可循环值守和多人录制的直播录制软件
可循环值守和多人录制的直播录制软件,支持抖音、TikTok、快手、虎牙、斗鱼、B站、小红书、网易cc、pandaTV等平台直播录制,抓取多平台直播源地址,抖音无水印解析,快手无水印解析
基于libVLC(VLC SDK)编程
在VLC官网上下载最新的软件安装包;
链接:http://www.videolan.org/vlc/index.html
SDK下载地址:http://download.videolan.org/pub/videolan/vlc/
记住安装目录,定位sdk文件夹;
include路径:
d:\2019LastCode\VC\2021VCL的SDK开发\vlc-3.0.12\sdk\include
d:\2019LastCode\VC\2021VCL的SDK开发\vlc-3.0.12\sdk\include\vlc
d:\2019LastCode\VC\2021VCL的SDK开发\vlc-3.0.12\sdk\include\vlc\plugins
lib路径:
d:\2019LastCode\VC\2021VCL的SDK开发\vlc-3.0.12\sdk\lib
简单播放例子
#include "vlc.h"
#include "libvlc.h"
#include "libvlc_media.h"
#pragma comment(lib, "libvlc.lib")
void Play(){
libvlc_instance_t * inst;
libvlc_media_player_t *mp;
libvlc_media_t *m;
libvlc_time_t length;
int width;
int height;
int wait_time = 60000;
//libvlc_time_t length;
/* Load the VLC engine */
inst = libvlc_new(0, NULL);
//m = libvlc_media_new_path(inst, "e:\\1.mp4");
m = libvlc_media_new_location(inst, "https://lbbf9.com/20191102/IO9PQD8v/index.m3u8");// "https://lbbf9.com/20191102/MNvGUjpW/index.m3u8");// "file:///e:\\1.mp4");
//m = libvlc_media_new_location(inst, "file:///e:\\1.mp4.avi");
//m = libvlc_media_new_location(inst, "file:///e:\\hello.mp4");
/* Create a media player playing environement */
mp = libvlc_media_player_new_from_media(m);
libvlc_media_parse(m);
length = libvlc_media_get_duration(m); //获取视频时长
/* No need to keep the media now */
libvlc_media_release(m);
// 把打开的媒体文件设置给播放器
libvlc_media_player_set_hwnd(mp, pCHelloVCLDlg->GetDlgItem(IDC_MV)->m_hWnd);
// play the media_player
libvlc_media_player_play(mp);
//Sleep(wait_time);
// return 0;
//wait until the tracks are created
//_sleep(wait_time);
Sleep(wait_time);
length = libvlc_media_player_get_length(mp);
width = libvlc_video_get_width(mp);
height = libvlc_video_get_height(mp);
printf("Stream Duration: %ds\n", length / 1000);
printf("Resolution: %d x %d\n", width, height);
//Let it play
//_sleep(length - wait_time);
Sleep(length - wait_time);
// Stop playing
libvlc_media_player_stop(mp);
// Free the media_player
libvlc_media_player_release(mp);
libvlc_release(inst);
}
#include <vlc/vlc.h>
#include <time.h>
int main(int argc, char* argv[])
{
7 libvlc_instance_t * vlc_ins = NULL;
8 libvlc_media_player_t * vlc_player = NULL;
9 libvlc_media_t * vlc_media = NULL;
10
11 const char * vlc_args[] =
12 {
13 "-I",
14 "dummy",
15 "--ignore-config",
16 "--extraintf=logger",
17 "--verbose=2",
18 };
19
20 // 创建一个VLC实例
21 vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
22 if(vlc_ins != NULL)
23 {
24 // 创建一个VLC播放器
25 vlc_player = libvlc_media_player_new(vlc_ins);
26 if(vlc_player != NULL)
27 {
28 // 通过文件路径创建一个媒体实例,这里是我的测试文件
29 vlc_media = libvlc_media_new_path(vlc_ins, "g:\\123.hlv");
30 if(vlc_media != NULL)
31 {
32 // 解析媒体实例
33 libvlc_media_parse(vlc_media);
34 // 获取媒体文件的播放长度, 返回 ms
35 libvlc_time_t duration = libvlc_media_get_duration(vlc_media);
36
37 // 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息
38 libvlc_media_track_info_t *media_tracks = NULL;
39 int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);
40 // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何
41 // free(media_tracks); // crash?
42
43 // 把打开的媒体文件设置给播放器
44 libvlc_media_player_set_media(vlc_player, vlc_media);
45
46 // 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试
47 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());
48 // 开始播放视频
49 libvlc_media_player_play(vlc_player);
50
51 // 这里仅是为了打印一些信息出来,20秒后退出
52 time_t last_time = time(NULL);
53 while((time(NULL) < (last_time + 200)))
54 {
55 Sleep(10);
56 // 获取当前播放位置
57 libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);
58 printf("playing time : %lld ms\r", (__int64)(play_time));
59
60 // 获取媒体的状态
61 // libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
62 // printf("\nmedia state : %d\n", (int)(media_state));
63 }
64 // 停止
65 libvlc_media_player_stop(vlc_player);
66 // 释放
67 libvlc_media_release(vlc_media);
68 }
69 // 释放
70 libvlc_media_player_release(vlc_player);
71 }
72 // 释放
73 libvlc_release(vlc_ins);
74 }
75 return 0;
}
HyperLPR3车牌识别-Android-SDK光速部署与使用
HyperLPR在2023年初已经更新到了v3的版本,该版本与先前的版本一样都是用于识别中文车牌的开源图像算法项目,最新的版本的源码可从github中提取:https://github.com/szad670401/HyperLPR
HyperLPR-Android-SDK for JitPack
HyperLPR3的官方源码已经提供在Android平台下使用该项目SDK的方法。Android SDK for HyperLPR3的组成部分主要为:HyperLPR3的Android工程模块、算法动态链接库、资源文件三个部分组成。但是对于一些不需要编译的同学,HyperLPR官方也提供了使用Jitpack作为依赖的导入方式,可以快速导入车牌识别SDK并进行快速部署使用到项目中。
JitPack依赖
在你的AndroidStudio工程下,找到你的settings.gradle文件,并将jitpack依赖放入:
repositories {
...
maven { url 'https://jitpack.io' }
}
如图所示:
从项目中导入hyperlpr-android-sdk
在你需要引入的工程所对应的build.gradle文件中引入hyperlpr-android-sdk的依赖:
dependencies {
...
implementation 'com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3'
}
如下图在app的工程中引入:
完成以上步骤后,点击Sync Now开始导入依赖包,由于依赖包有一定的体积,加上网络环境可能会较差,导包时间会较长
开始使用车牌识别SDK
当完成以上步骤后,即可在安卓工程中使用车牌识别SDK
SDK初始化
在使用SDK时需要对SDK进行初始化配置,否则车牌识别算法会失效,初始化仅需也只能执行一次,通常推荐放置于程序运行时的主程序页面中进行注册。初始化需要传入一个Context和车牌识别参数对象HyperLPRParameter,参数需根据用户使用进行调整。
// 车牌识别算法配置参数
HyperLPRParameter parameter = new HyperLPRParameter()
.setDetLevel(HyperLPR3.DETECT_LEVEL_LOW)
.setMaxNum(1)
.setRecConfidenceThreshold(0.85f);
// 初始化(仅执行一次生效)
HyperLPR3.getInstance().init(this, parameter);
使用车牌识别函数
完成初始化后,即可使用车牌识别函数,这里以一个Bitmap图像作为示例进行调用:
// 使用Bitmap作为图片参数进行车牌识别
Plate[] plates = HyperLPR3.getInstance().plateRecognition(bitmap, HyperLPR3.CAMERA_ROTATION_0, HyperLPR3.STREAM_BGRA);
for (Plate plate: plates) {
// 打印检测到的车牌号
Log.i(TAG, plate.getCode());
}
如上所示,仅使用几句代码就可以实现车牌识别的部署与最快调试。
更多示例
如果以上的功能无法满足或帮助到你,我们在项目源工程中提供了一个更加丰富的使用案例:Prj-Android,你可以使用AndroidStudio打开并运行这个项目,项目中包含了图片识别车牌与实时识别车牌的案例,希望可以帮助到你。
直接体验
如果你需要直接体验HyperLPR安卓版本的Demo,官网已经提供好了APK,只需扫码下载即可安装
支持更丰富的车牌种类
帮助
以上为HyperLPR3的AndroidSDK快速上手,需要获取其他的帮助,请移步到项目地址:https://github.com/szad670401/HyperLPR
GPT4All开源的ChatGPT软件并提供开发接口
开发接口:
- 🐍 Official Python Bindings
- 💻 Official Typescript Bindings
- 💻 Official GoLang Bindings
- 💻 Official C# Bindings
- 💻 Official Java Bindings
Python调用例子:
# pip install gpt4all
#
from gpt4all import GPT4All
from translate import Translator # 添加翻译包
#model = GPT4All("mistral-7b-openorca.Q4_0.gguf", device='gpu') # device='amd', device='intel'
#model_name='nous-hermes-llama2-13b.Q4_0.gguf',
translator = Translator(from_lang="english" , to_lang="chinese")
model = GPT4All(# model_name='nous-hermes-llama2-13b.Q4_0.gguf',
model_name='gpt4all-falcon-newbpe-q4_0.gguf',
model_path=r'C:/Users/xn/AppData/Local/nomic.ai/GPT4All/',
device='nvidia',
allow_download=False)
output = model.generate("以下对话请用中文回答", temp=0, max_tokens=200)
output = model.generate("以春天为题材写一遍50字以内的文章", temp=0, max_tokens=200)
output = translator.translate(output[0:20])
print(output)
with model.chat_session():
response1 = model.generate(prompt='hello', temp=0)
print(response1)
response2 = model.generate(prompt='write me a short poem', temp=0)
response3 = model.generate(prompt='thank you', temp=0)
print(model.current_chat_session)
开源、免费的离线OCR软件
OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库
免费:本项目所有代码开源,完全免费。
方便:解压即用,离线运行,无需网络。
高效:自带高效率的离线OCR引擎,内置多种语言识别库。
灵活:支持命令行、HTTP接口等外部调用方式。
支持命令行与http接口
命令行:
获取说明:Umi-OCR.exe --help
软件操控指令
弹出主窗口:Umi-OCR.exe --show
隐藏主窗口:Umi-OCR.exe --hide
关闭软件:Umi-OCR.exe --quit
OCR指令
截屏:Umi-OCR.exe --screenshot
粘贴图片:Umi-OCR.exe --clipboard
指定路径:Umi-OCR.exe --path "D:/xxx.png"
可传入文件夹的路径。将搜索文件夹中所有图片(包括嵌套子文件夹),并输出所有识别结果。
可传入多个路径。请用双引号""包裹单个路径,不同路径间用空格 隔开。
指定多个路径示例:Umi-OCR.exe --path "D:/img1.png" "D:/img2.png" "D:/image/test"
提示:
多图识别时,耗时较长;一次命令结束前不要输入下一个命令。
对于截屏、粘贴、路径指令,OCR参数(如识别语言,是否复制到剪贴板、是否弹出主窗口)采用截图OCR标签页的设定。如果不希望命令行任务弹出主窗口,请在截图OCR标签页中关闭该选项。
二维码指令
识别二维码:Umi-OCR.exe --qrcode_read "D:/xxx.png"
与OCR指令一致,二维码识别的指令也支持传入多个图片&文件夹路径。
生成二维码:Umi-OCR.exe --qrcode_create "文本内容" "D:/输出图片.jpeg"
默认的图片宽高为最小适配长度。也可以在指令后方加上数字,手动指定图片宽高:
例,同时指定宽高为128像素:Umi-OCR.exe --qrcode_create "文本内容" "D:/输出图片.jpeg" 128
例,宽128,高256像素:Umi-OCR.exe --qrcode_create "文本内容" "D:/输出图片.jpeg" 128 256
关于指令简写
所有指令支持用前几个字母替代,如--screenshot、--clipboard可以分别简写为--sc、--cl。具体可自己尝试。
对于大部分系统,支持使用小写文件名+省略.exe,例: umi-ocr --sc
结果输出
复制到剪贴板 --clip
输出到文件(覆盖) --output "文件路径.txt"
输出到文件(追加) --output_append "文件路径.txt"
也可以使用箭头符号:
"-->" 等价于 --output
"-->>" 等价于 --output_append
例:
./Umi-OCR.exe --screenshot --clip
./Umi-OCR.exe --screenshot --output test.txt
./Umi-OCR.exe --screenshot "-->" test.txt
HTTP接口手册
1. 图片OCR:Base64 识别接口
传入一个base64编码的图片,返回OCR识别结果。
URL:/api/ocr
例:http://127.0.0.1:1224/api/ocr(实际端口请在全局设置中查看)
1.1. 请求格式
方法:POST
参数:json
参数名 类型 描述
base64 string 待识别图像的 Base64 编码字符串,无需前缀
options object 【可选】配置选项字典
base64无需data:image/png;base64,等前缀,直接放正文。
options 是可选的,可以不传这个参数。如果传了,则内部的所有子参数也均为可选。
参数示例:
{
"base64": "iVBORw0KGgoAAAAN……",
"options": {
# 通用参数
"tbpu.parser": "multi_para",
"data.format": "json",
# 引擎参数
"ocr.angle": false,
"ocr.language": "简体中文",
"ocr.maxSideLen": 1024
}
}
options 中有两部分参数:通用参数 和 引擎参数 。
通用参数 是在任何情况下都适用的,选项:
data.format :数据返回格式。返回值字典中,["data"] 按什么格式表示OCR结果数据。可选值(字符串):
dict:含有位置等信息的原始字典(默认)
text:纯文本
tbpu.parser :排版解析方案。可选值(字符串):
multi_para:多栏-按自然段换行(默认)
multi_line:多栏-总是换行
multi_none:多栏-无换行
single_para:单栏-按自然段换行
single_line:单栏-总是换行
single_none:单栏-无换行
single_code:单栏-保留缩进,适用于解析代码截图
none:不做处理
引擎参数 对于加载不同引擎插件时,可能有所不同。完整参数说明请通过 get_options 接口查询。以下是一些示例:
PaddleOCR 引擎参数 类型 默认值 描述
ocr.language string models/config_chinese.txt 识别语言。可选值请通过 get_options 接口查询
ocr.cls boolean false 是否进行图像旋转校正。true/false
ocr.limit_side_len int 960 图像压缩边长。允许 960/2880/4320/999999
RapidOCR 引擎参数 类型 默认值 描述
ocr.language string 简体中文 识别语言。可选值请通过 get_options 接口查询
ocr.angle boolean false 是否进行图像旋转校正。true/false
ocr.maxSideLen int 1024 图像压缩边长。允许 1024/2048/4096/999999
1.2. 响应格式
json
字段名 类型 描述
code int 任务状态。100为成功,101为无文本,其余为失败
data list/string 识别结果,格式见下
time double 识别耗时(秒)
timestamp double 任务开始时间戳(秒)
data 格式
图片中无文本(code==101),或识别失败(code!=100 and code!=101)时:
["data"]为string,内容为错误原因。例: {"code": 902, "data": "向识别器进程传入指令失败,疑似子进程已崩溃"}
识别成功(code==100)时,如果options中data.format为dict(默认值):
["data"]为list,每一项元素为dict,包含以下子元素:
参数名 类型 描述
text string 文本
score double 置信度 (0~1)
box list 文本框顺时针四个角的xy坐标:[左上,右上,右下,左下]
end string 表示本行文字结尾的结束符,根据排版解析得出。可能为空、空格、换行。
结果示例:
{
"code": 100,
"data": [
{
"text": "第一行的文本,",
"score": 0.99800001,
"box": [[x1,y1], [x2,y2], [x3,y3], [x4,y4]],
"end": "",
},
{
"text": "第二行的文本",
"score": 0.97513333,
"box": [[x1,y1], [x2,y2], [x3,y3], [x4,y4]],
"end": "\n",
},
]
}
识别成功(code==100)时,如果options中data.format为text:
["data"]为string,即所有OCR结果的拼接。例:
"data": "第一行的文本,第二行的文本\n"
1.3. 调用接口 示例代码
JavaScript 示例:
const url = 'http://127.0.0.1:1224/api/ocr';
const data = {
base64: "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAXCAIAAAD7ruoFAAAACXBIWXMAABnWAAAZ1gEY0crtAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAAHjSURBVEiJ7ZYrcsMwEEBXnR7FLuj0BPIJHJOi0DAZ2qSsMCxEgjYrDQqJdALrBJ2ASndRgeNI8ledutOCLrLl1e7T/mRkjIG/IXe/DWBldRTNEoQSpgNURe5puiiaJehrMuJSXSTgbaby0A1WzLrCCQCmyn0FwoN0V06QONWAt1nUxfnjHYA8p65GjhDKxcjedVH6JOejBPwYh21eE0Wzfe0tqIsEkGXcVcpoMH4CRZ+P0lsQp/pWJ4ripf1XFDFe8GHSHlYcSo9Es31t60RdFlN1RUmrma5oTzTVB8ZUaeeYEC9GmL6kNkDw9BANAQYo3xTNdqUkvHq+rYhDKW0Bj3RSEIpmyWyBaZaMTCrCK+tJ5Jsa07fs3E7esE66HzralRLgJKp0/BD6fJRSxvmDsb6joqkcFXGqMVVFFEHDL2gTxwCAaTabnkFUWhDCHTd9iYrGcAL1ZnqIp5Vpiqh7bCfua7FA4qN0INMcN1+cgCzj+UFxtbmvwdZvGIrI41JiqhZBWhhF8WxorkYPpQwJiWYJeA3rXE4hzcwJ+B96F9zCFHC0FcVegghvFul7oeEE8PvHeJqC0w0AUbbFIT8JnEwGbPKcS2OxU3HMTqD0r4wgEIuiKJ7i4MS16+og8/+bPZRPLa+6Ld2DSzcAAAAASUVORK5CYII=",
// 可选参数
// Paddle引擎模式
// "options": {
// "ocr.language": "models/config_chinese.txt",
// "ocr.cls": false,
// "ocr.limit_side_len": 960,
// "tbpu.parser": "multi_para",
// "data.format": "text",
// }
// Rapid引擎模式
// "options": {
// "ocr.language": "简体中文",
// "ocr.angle": false,
// "ocr.maxSideLen": 1024,
// "tbpu.parser": "multi_para",
// "data.format": "text",
// }
};
fetch(url, {
method: "POST", body: JSON.stringify(data),
headers: {"Content-Type": "application/json"},
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
Python 示例:
import requests
import json
url = "http://127.0.0.1:1224/api/ocr"
data = {
"base64": "iVBORw0KGgoAAAANSUhEUgAAAC4AAAAXCAIAAAD7ruoFAAAACXBIWXMAABnWAAAZ1gEY0crtAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAAHjSURBVEiJ7ZYrcsMwEEBXnR7FLuj0BPIJHJOi0DAZ2qSsMCxEgjYrDQqJdALrBJ2ASndRgeNI8ledutOCLrLl1e7T/mRkjIG/IXe/DWBldRTNEoQSpgNURe5puiiaJehrMuJSXSTgbaby0A1WzLrCCQCmyn0FwoN0V06QONWAt1nUxfnjHYA8p65GjhDKxcjedVH6JOejBPwYh21eE0Wzfe0tqIsEkGXcVcpoMH4CRZ+P0lsQp/pWJ4ripf1XFDFe8GHSHlYcSo9Es31t60RdFlN1RUmrma5oTzTVB8ZUaeeYEC9GmL6kNkDw9BANAQYo3xTNdqUkvHq+rYhDKW0Bj3RSEIpmyWyBaZaMTCrCK+tJ5Jsa07fs3E7esE66HzralRLgJKp0/BD6fJRSxvmDsb6joqkcFXGqMVVFFEHDL2gTxwCAaTabnkFUWhDCHTd9iYrGcAL1ZnqIp5Vpiqh7bCfua7FA4qN0INMcN1+cgCzj+UFxtbmvwdZvGIrI41JiqhZBWhhF8WxorkYPpQwJiWYJeA3rXE4hzcwJ+B96F9zCFHC0FcVegghvFul7oeEE8PvHeJqC0w0AUbbFIT8JnEwGbPKcS2OxU3HMTqD0r4wgEIuiKJ7i4MS16+og8/+bPZRPLa+6Ld2DSzcAAAAASUVORK5CYII=",
# 可选参数
# Paddle引擎模式
# "options": {
# "ocr.language": "models/config_chinese.txt",
# "ocr.cls": False,
# "ocr.limit_side_len": 960,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
# Rapid引擎模式
# "options": {
# "ocr.language": "简体中文",
# "ocr.angle": False,
# "ocr.maxSideLen": 1024,
# "tbpu.parser": "multi_para",
# "data.format": "text",
# }
}
headers = {"Content-Type": "application/json"}
data_str = json.dumps(data)
response = requests.post(url, data=data_str, headers=headers)
if response.status_code == 200:
res_dict = json.loads(response.text)
print("返回值字典\n", res_dict)
2. 图片OCR:参数查询接口
返回当前需要提供哪些options参数。
URL:/api/ocr/get_options
例:http://127.0.0.1:1224/api/ocr/get_options
2.1. 请求格式
方法:GET
参数:无
2.2. 响应格式
json
以PaddleOCR引擎插件为例:
{
"ocr.language": {
"title": "语言/模型库",
"optionsList": [
["models/config_chinese.txt","简体中文"],
["models/config_en.txt","English"],
["models/config_chinese_cht(v2).txt","繁體中文"],
["models/config_japan.txt","日本語"],
["models/config_korean.txt","한국어"],
["models/config_cyrillic.txt","Русский"]
],
"type": "enum",
"default": "models/config_chinese.txt"
},
"ocr.cls": {
"title": "纠正文本方向",
"default": false,
"toolTip": "启用方向分类,识别倾斜或倒置的文本。可能降低识别速度。",
"type": "boolean"
},
"ocr.limit_side_len": {
"title": "限制图像边长",
"optionsList": [
[ 960, "960 (默认)" ],
[ 2880, "2880" ],
[ 4320, "4320" ],
[ 999999, "无限制" ]
],
"toolTip": "将边长大于该值的图片进行压缩,可以提高识别速度。可能降低识别精度。",
"type": "enum",
"default": 960
},
"tbpu.parser": {
"title": "排版解析方案",
"toolTip": "按什么方式,解析和排序图片中的文字块",
"default": "multi_para",
"optionsList": [
["multi_para","多栏-按自然段换行"],
["multi_line","多栏-总是换行"],
["multi_none","多栏-无换行"],
["single_para","单栏-按自然段换行"],
["single_line","单栏-总是换行"],
["single_none","单栏-无换行"],
["single_code","单栏-保留缩进"],
["none","不做处理"]
]
},
"data.format": {
"title": "数据返回格式",
"toolTip": "返回值字典中,[\"data\"] 按什么格式表示OCR结果数据",
"default": "dict",
"optionsList": [
["dict", "含有位置等信息的原始字典"],
["text","纯文本"]
]
}
}
可以看到,上述示例中,拥有5个配置参数:ocr.language、ocr.cls、ocr.limit_side_len、tbpu.parser、data.format 。
其中ocr.cls是布尔值,对应到UI面板中的开关。调用接口时,应该传入true或false。
其余参数都是枚举,对应下拉栏UI。optionsList的元素的第0位是key,第1位是显示文本。调用接口时,应该传入key值的字符串。比如对于如下的 optionsList ,应该传入 "dict" 或 "text" 。
["dict", "含有位置等信息的原始字典"],
["text","纯文本"]
2.3. 调用接口 示例代码
JavaScript 示例:
const url = "http://127.0.0.1:1224/api/ocr/get_options";
fetch(url, {
method: "GET",
headers: { "Content-Type": "application/json" },
})
.then(response => response.json())
.then(data => { console.log(data); })
.catch(error => { console.error(error); });
3. 二维码:Base64 识别接口
传入一个base64编码的图片,返回二维码识别结果。
URL:/api/qrcode
例:http://127.0.0.1:1224/api/qrcode
3.1. 请求格式
方法:POST
参数:json
参数名 类型 描述
base64 string 待识别图像的 Base64 编码字符串,无需前缀
base64无需data:image/png;base64,等前缀,直接放正文。
参数示例:
{ "base64": "iVBORw0KGgoAAAAN……" }
3.2. 响应格式
json
与 OCR 结果的格式非常相似。
字段名 类型 描述
code int 任务状态。100成功,101没找到二维码,其余为失败
data list/string 识别结果,格式见下
time double 识别耗时(秒)
timestamp double 任务开始时间戳(秒)
data 格式
没找到二维码(code==101),或识别失败(code!=100 and code!=101)时:
["data"]为string,内容为错误原因。例: {"code": 204, "data": "【Error】zxingcpp 二维码解析失败。\n[Error] zxingcpp read_bar……"}
识别成功(code==100)时:
["data"]为list,记录图片中每个二维码的结果(因为一张图片可能含多个码)。每项结果的子元素为:
参数名 类型 描述
text string 二维码文本。
format string 二维码格式,如 "QRCode" 等,具体见下。
box list 文本框顺时针四个角的xy坐标:[左上,右上,右下,左下]
orientation int 二维码方向。0为正上。
score int 为了与OCR格式兼容而设,永远为1,无意义。
二维码格式:
"Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","EAN13","EAN8","ITF","LinearCodes","MatrixCodes","MaxiCode","MicroQRCode","PDF417","QRCode","UPCA","UPCE"
结果示例:
{
"code": 100,
"data": [ {
"orientation": 0,
"box": [[4,4],[25,4],[25,25],[4,25]],
"score": 1,
"format": "QRCode",
"text": "abc"
} ],
"time": 0,
"timestamp": 1711521012.625574
}
3.3. 调用接口 示例代码
JavaScript 示例:
const url = "http://127.0.0.1:1224/api/qrcode";
const base64 = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAdAB0BAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APU/GfjM+EjAzW9o0DW8txNPdXEkSxKkkMYAEcUjMS069hjBrn3+K0yi3B0/RozO52y3OtG3gaPy7WRWV5IVJO27DFSoIEbYycCrF18Sb2z1a20u70rTbO8uLiKzigutRl3NcNDBIyAxW7rhTcIu4sAcE8Cu00LU/wC2/D2mat5Pk/brSK58rdu2b0Dbc4GcZxnAri/iSdPGs6AuqySW+nzpcW11dg27xwIzQspkimikDIZUiG/5QhK5PzCuPI1qz8ISalajUtNu1czLGsxnt7tHhhhiijNmkSF22W8aFeFWZ2RjIjeVXvrq0t/EWmaTpq3d9rTXFpCqpa2iRW92sCJOUP2WZYjEsNszrG7Bd/GNhr2zQtP/ALI8PaZpuMfY7SK3x5nmY2IF+9tXd067Vz6DpXH/ABK1LVrN7SLTIr6622k159isYYnknkjuLVUI8yGXGzzWfhc5UHPFeeSyav4dtI9R8O+Ho5dYS4WNrSK1EV2sb29ncFJY7aOPzIkkYhjhSGaME7WdHy72y8NWthbfDxrrfDDdpdXH2eVvtIu/IcStcOUaCGFMqGKNKUELZDEsU+g/DUcMXhXSI7cRrAllCsYjIKhQgxgh3BGP9t/95upk1PQtH1vyv7W0qxv/ACc+X9rt0l2ZxnG4HGcDp6Co7Xw1oNiipaaJptuiPvVYbVEAbcjZGB13RxnPqin+EYksdC0fTIo4rDSrG0jjlM6JBbpGFkKlC4AHDFSVz1wcdKuQQQ2tvFb28UcMESBI441CqigYAAHAAHGK/9k="
const data = { "base64": base64 };
fetch(url, {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
if(data.code === 100) {
console.log("识别二维码成功!图片中的二维码数量:", data.data.length);
console.log("二维码内容:");
for (let d of data.data) {
console.log(" 文本:", d.text);
console.log(" 格式:", d.format);
console.log(" 方向:", d.orientation);
console.log(" ====");
}
}
else {
console.log("识别二维码失败!错误码:", data.code, " 错误信息:", data.data);
}
})
.catch(error => {
console.error(error);
});
4. 二维码:从文本生成图片
传入文本,根据文本生成二维码图片,返回图片base64。
URL:/api/qrcode (与二维码识别接口一致,只是参数不同)
例:http://127.0.0.1:1224/api/qrcode
4.1. 请求格式
方法:POST
参数:json
参数名 类型 描述
text string 要写入二维码的文本
options dict 控制参数,选填
options 是可选的,可以不传这个参数。如果传了,则内部的所有子参数也均为可选。
参数示例:
{
"text": "要写入二维码的文本",
"options": {
"format": "QRCode", // 二维码格式
"w": 0, // 图像宽度,0为自动设为最小宽度
"h": 0, // 图像高度
"quiet_zone": -1, // 码四周的空白边缘宽度,-1为自动
"ec_level": -1, // 纠错等级,-1为自动
}
}
options参数名 类型 默认值 描述
format string "QRCode" 码格式的可选值 见上文
w int 0 图像宽度,0自动设为最小宽度
h int 0 图像高度
quiet_zone int -1 码四周的空白边缘宽度,-1为自动
ec_level int -1 纠错等级,-1为自动,可选值见下
ec_level 可选值: -1:自动, 1:7%,0:15%,3:25%, 2:30%。
ec_level 纠错仅对这些格式生效:Aztec、PDF417、QRCode 。
4.2. 响应格式
json
字段名 类型 描述
code int 任务状态。100成功,其余为失败
data string 生成结果,格式见下
生成图片成功(code==100)时:"data" 为图片的base64字符串,图片编码为jpeg。
生成图片失败(code!=100)时:"data" 为错误信息字符串。
4.3. 调用接口 示例代码
JavaScript 示例:
const url = "http://127.0.0.1:1224/api/qrcode";
const data = {
// 必填
"text": "测试文本",
// 选填
"options": {
"format": "QRCode", // 码类型
"w": 0, // 图像宽度,0为自动设为最小宽度
"h": 0, // 图像高度
"quiet_zone": -1, // 码四周的空白边缘宽度,-1为自动
"ec_level": -1, // 纠错等级,-1为自动
}
};
fetch(url, {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
if(data.code === 100) {
console.log("生成二维码base64:", data.data);
}
else {
console.log("生成二维码base64失败!错误码:", data.code, " 错误信息:", data.data);
}
})
.catch(error => {
console.error(error);
});
5. 命令行 接口
此接口用于命令行参数的跨进程传输,一般由程序内部自动调用。开发者也可手动调用。
由于此接口较敏感(如允许访问本机图片、关闭软件等),故只允许本地环回 127.0.0.1 调用。局域网或外网无法访问此接口。
URL:/argv
例:http://127.0.0.1:1224/argv
请求
方法:POST
参数:json list
传入一个 列表 ,列表中记录命令行参数。
如:命令行调用 Umi-OCR.exe --path "D:/xxx.png"
等价于向argv接口发送: ["--path", "D:/xxx.png"]
具体命令行规则请见 README_CLI.md 。
调用接口 示例代码
JavaScript 示例:
const url = "http://127.0.0.1:1224/argv";
// 发送截图指令 Umi-OCR.exe --screenshot
const data = ["--screenshot"];
fetch(url, {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(data)
})
.then(response => response.text()) // 返回值是字符串
.then(data => {
console.log("截图结果:\n", data)
})
.catch(error => {
console.error(error);
});
开源的车牌识别系统HyperLPR
上一篇:开发相关软件使用
下一篇:日常开发技术收集积累