android11 usb摄像头添加多分辨率支持
部分借鉴于:https://blog.csdn.net/weixin_45639314/article/details/142210634
目录
一、需求介绍
二、UVC介绍
三、解析
四、补丁修改
1、预览的限制主要存在于hal层和framework层
2、添加所需要的分辨率:
3、hal层修改
4、frameworks
5、备用方案
一、需求介绍
这个问题是碰到了一个客户,他的需求是在Android11 rk3566上需要支持1080p以上的usb摄像头支持,而在我们Android11系统原生的相机中可以打开的最大分辨率也是1080p(即2.1百万像素)。
而我们客户需要支持2560*1440(2k-四百万像素),和最大3840*2610(4k-800万像素)。
二、UVC介绍
UVC(USB Video Class)是一种 USB 设备类标准,允许通过 USB 连接的视频设备(如摄像头、网络摄像头和其他视频捕捉设备)与计算机或其他主机设备进行通信。UVC 使得视频设备的使用变得更加简单和通用,因为它不需要特定的驱动程序,主机操作系统通常可以直接识别和使用这些设备。
特点:
1、即插即用:
UVC 设备可以在连接到主机时自动识别,无需安装额外的驱动程序。这使得用户能够快速方便地使用视频设备。
2、跨平台支持:
UVC 设备通常可以在多种操作系统上工作,包括 Windows、macOS 和 Linux。这种跨平台的兼容性使得 UVC 成为视频设备的标准选择。
3、视频格式支持:
UVC 支持多种视频格式和分辨率,包括 MJPEG、YUY2、H.264 等。设备可以根据主机的能力和应用程序的需求选择合适的格式。
4、控制功能:
UVC 设备通常支持多种控制功能,例如亮度、对比度、饱和度、焦距等。这些控制可以通过 USB 接口进行调整。
5、流媒体支持:
UVC 设备可以用于实时视频流传输,适用于视频会议、直播、监控等应用场景。
三、解析
1、v4l2命令的使用
//列出所有设视频设备
v4l2-ctl --list-devices
//获取特定设备的支持格式
v4l2-ctl --device=/dev/video23 --list-formats
//获取设备支持的分辨率
v4l2-ctl -d /dev/video23 --list-framesizes=YUYV
2、查看打开的摄像头的各种信息
dumpsys media.camera
四、补丁修改
1、预览的限制主要存在于hal层和framework层
关于摄像头部分的源码目录:
#SDK 接口
frameworks/base/core/java/android/hardware/Camera.java
frameworks/base/core/jni/android_hardware_Camera.cpp#上层 Camera 服务
frameworks/av/camera/# HAL层
hardware/rockchip/camera
hardware/interfaces/camera/# 配置文件,对应USB和CSI之类的摄像头配置
# 包含了支持分辨率,闪光灯等等的一些特性。
device/rockchip/common/external_camera_config.xml
hardware/rockchip/camera/etc/camera/
2、添加所需要的分辨率:
diff --git a/device/rockchip/common/external_camera_config.xml b/device/rockchip/common/external_camera_config.xml
index d377826..d5ddd9d 100755
--- a/external_camera_config.xml
+++ b/external_camera_config.xml
@@ -60,13 +60,18 @@<Limit width="1600" height="1200" fpsBound="15.0" /><Limit width="1920" height="1080" fpsBound="30.0" /><Limit width="1920" height="1080" fpsBound="15.0" />
+ <Limit width="2560" height="1440" fpsBound="30.0" />
+ <Limit width="2560" height="1440" fpsBound="15.0" /><Limit width="2592" height="1944" fpsBound="30.0" /><Limit width="2592" height="1944" fpsBound="15.0" /><Limit width="2592" height="1944" fpsBound="10.0" /><Limit width="2592" height="1944" fpsBound="5.0" />
+ <Limit width="3840" height="2160" fpsBound="30.0" />
+ <Limit width="3840" height="2160" fpsBound="15.0" /><!-- image size larger than the last entry will not be supported--></FpsList><!-- orientation -->
- <Orientation degree="90"/>
+ <!-- <Orientation degree="90"/> 这里调整的是摄像头的旋转方向 -->
+ <Orientation degree="0"/> <!-- for qipai camera --></Device></ExternalCamera>
3、hal层修改
源码路径:hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
diff --git a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
index 55a2c3d08d..d3eb278093 100644
--- a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
+++ b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
@@ -21,21 +21,21 @@
namespace android {
namespace camera2 {
-#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
+//#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
#define RGA_VER (2.0)
#define RGA_ACTIVE_W (4096)
#define RGA_VIRTUAL_W (4096)
#define RGA_ACTIVE_H (4096)
#define RGA_VIRTUAL_H (4096)
-#else
-#define RGA_VER (1.0)
-#define RGA_ACTIVE_W (2048)
-#define RGA_VIRTUAL_W (4096)
-#define RGA_ACTIVE_H (2048)
-#define RGA_VIRTUAL_H (2048)
+//#else
+//#define RGA_VER (1.0)
+//#define RGA_ACTIVE_W (2048)
+//#define RGA_VIRTUAL_W (4096)
+//#define RGA_ACTIVE_H (2048)
+//#define RGA_VIRTUAL_H (2048)
-#endif
+//#endif
int RgaCropScale::CropScaleNV12Or21(struct Params* in, struct Params* out)
4、frameworks
源码路径:frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
上层接口解除1080P的限制。
diff --git a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
index 3a709c9791..163d060b81 100644
--- a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
+++ b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
@@ -199,11 +199,11 @@ struct Parameters {// Max preview size allowed// This is set to a 1:1 value to allow for any aspect ratio that has// a max long side of 1920 pixels
- static const unsigned int MAX_PREVIEW_WIDTH = 1920;
- static const unsigned int MAX_PREVIEW_HEIGHT = 1920;
+ static const unsigned int MAX_PREVIEW_WIDTH = 4656;
+ static const unsigned int MAX_PREVIEW_HEIGHT = 3496;// Initial max preview/recording size bound
- static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;
- static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;
+ static const int MAX_INITIAL_PREVIEW_WIDTH = 4656;
+ static const int MAX_INITIAL_PREVIEW_HEIGHT = 3496;// Aspect ratio tolerancestatic const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001;// Threshold for slow jpeg mode
到这里,系统相机—设置—分辨率与画质,应该就可以看到对应的最大的分辨率了。
5、备用方案
如果以上修改未能生效,可参考以下修改(该部分有经RK厂商修改):
hardware/interfaces/camera
From 75e1d29219f929404f3b42b994ac36dde19b0c82 Mon Sep 17 00:00:00 2001
From: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date: Tue, 19 Jan 2021 21:26:03 +0800
Subject: [PATCH 1/4] Camera: fix loss resolution issuesSigned-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Change-Id: I01f614eec54168ab34e0c7376296a64804af9a1a
---.../3.4/default/ExternalCameraDevice.cpp | 75 ++++++++++++++++---.../3.4/default/ExternalCameraUtils.cpp | 0.../ExternalCameraUtils.h | 1 +3 files changed, 65 insertions(+), 11 deletions(-)mode change 100644 => 100755 camera/device/3.4/default/ExternalCameraUtils.cppmode change 100644 => 100755 camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.hdiff --git a/camera/device/3.4/default/ExternalCameraDevice.cpp b/camera/device/3.4/default/ExternalCameraDevice.cpp
index d196e4b4f..882698fd3 100755
--- a/camera/device/3.4/default/ExternalCameraDevice.cpp
+++ b/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -338,6 +338,7 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(// android.jpegconst int32_t jpegAvailableThumbnailSizes[] = {0, 0,
+ 160, 120,176, 144,240, 144,256, 144,
@@ -587,15 +588,24 @@ status_t ExternalCameraDevice::initOutputCharskeysByFormat(return UNKNOWN_ERROR;}+ ALOGV("inputfourcc:%c%c%c%c",
+ fourcc & 0xFF,
+ (fourcc >> 8) & 0xFF,
+ (fourcc >> 16) & 0xFF,
+ (fourcc >> 24) & 0xFF);
+std::vector<int32_t> streamConfigurations;std::vector<int64_t> minFrameDurations;std::vector<int64_t> stallDurations;for (const auto& supportedFormat : mSupportedFormats) {
+#if 0
+ // wpzz add don't need skip now.if (supportedFormat.fourcc != fourcc) {// Skip 4CCs not meant for the halFormatscontinue;}
+#endiffor (const auto& format : halFormats) {streamConfigurations.push_back(format);streamConfigurations.push_back(supportedFormat.width);
@@ -633,6 +643,13 @@ status_t ExternalCameraDevice::initOutputCharskeysByFormat(stallDurations.push_back(supportedFormat.height);stallDurations.push_back(stall_duration);}
+ ALOGV("supportedFormat:%c%c%c%c, w %d, h %d, minFrameDuration(%lld)",
+ supportedFormat.fourcc & 0xFF,
+ (supportedFormat.fourcc >> 8) & 0xFF,
+ (supportedFormat.fourcc >> 16) & 0xFF,
+ (supportedFormat.fourcc >> 24) & 0xFF,
+ supportedFormat.width, supportedFormat.height, minFrameDuration);
+}UPDATE(streamConfiguration, streamConfigurations.data(), streamConfigurations.size());
@@ -667,6 +684,8 @@ bool ExternalCameraDevice::calculateMinFps(fpsRanges.push_back(framerate);}minFps /= 2;
+ if (0 == minFps)
+ minFps = 1;int64_t maxFrameDuration = 1000000000LL / minFps;UPDATE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, fpsRanges.data(),
@@ -713,26 +732,24 @@ status_t ExternalCameraDevice::initOutputCharsKeys(}}- if (hasDepth) {
- initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_Z16, halDepthFormats,
- ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT,
- ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
- ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS,
- ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
- }if (hasColor) {initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
- }
- if (hasColor_yuv) {
+ } else if (hasColor_yuv) {initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_YUYV, halFormats,ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
+ } else if (hasDepth) {
+ initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_Z16, halDepthFormats,
+ ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT,
+ ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
+ ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS,
+ ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);}calculateMinFps(metadata);
@@ -765,7 +782,7 @@ status_t ExternalCameraDevice::initOutputCharsKeys(void ExternalCameraDevice::getFrameRateList(int fd, double fpsUpperBound, SupportedV4L2Format* format) {format->frameRates.clear();
-
+ format->maxFramerate = 1.0f;v4l2_frmivalenum frameInterval {.pixel_format = format->fourcc,.width = format->width,
@@ -773,6 +790,13 @@ void ExternalCameraDevice::getFrameRateList(.index = 0};+ ALOGV("format:%c%c%c%c, w %d, h %d, fpsUpperBound %f",
+ frameInterval.pixel_format & 0xFF,
+ (frameInterval.pixel_format >> 8) & 0xFF,
+ (frameInterval.pixel_format >> 16) & 0xFF,
+ (frameInterval.pixel_format >> 24) & 0xFF,
+ frameInterval.width, frameInterval.height, fpsUpperBound);
+for (frameInterval.index = 0;TEMP_FAILURE_RETRY(ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frameInterval)) == 0;++frameInterval.index) {
@@ -782,6 +806,9 @@ void ExternalCameraDevice::getFrameRateList(frameInterval.discrete.numerator,frameInterval.discrete.denominator};double framerate = fr.getDouble();
+ if (framerate > format->maxFramerate) {
+ format->maxFramerate = framerate;
+ }if (framerate > fpsUpperBound) {continue;}
@@ -837,7 +864,7 @@ void ExternalCameraDevice::trimSupportedFormats(const auto& maxSize = sortedFmts[sortedFmts.size() - 1];float maxSizeAr = ASPECT_RATIO(maxSize);
-
+#if 0 //该位置确认自己的camera调用的是哪一个接口// Remove formats that has aspect ratio not croppable from largest sizestd::vector<SupportedV4L2Format> out;for (const auto& fmt : sortedFmts) {
@@ -855,6 +882,15 @@ void ExternalCameraDevice::trimSupportedFormats(maxSize.width, maxSize.height);}}
+#else
+ std::vector<SupportedV4L2Format> out;
+ //all enum format added to SupportedFormat
+ ALOGD("%s(%d): don't care ratio of horizontally or vertical ",__FUNCTION__, __LINE__);
+
+ for (const auto& fmt : sortedFmts) {
+ out.push_back(fmt);
+ }
+#endifsortedFmts = out;}@@ -1007,6 +1043,23 @@ void ExternalCameraDevice::initSupportedFormatsLocked(int fd) {mCroppingType = VERTICAL;}}
+ /* mSupportedFormats has been sorted by size
+ remove the same size format */
+ std::vector<SupportedV4L2Format> tmp;
+ for (int i = 0; i < mSupportedFormats.size(); ) {
+ if ((mSupportedFormats[i+1].width == mSupportedFormats[i].width) &&
+ (mSupportedFormats[i+1].height == mSupportedFormats[i].height)) {
+ if (mSupportedFormats[i+1].maxFramerate > mSupportedFormats[i].maxFramerate)
+ tmp.push_back(mSupportedFormats[i+1]);
+ else
+ tmp.push_back(mSupportedFormats[i]);
+ i = i + 2;
+ } else {
+ tmp.push_back(mSupportedFormats[i]);
+ i++;
+ }
+ }
+ mSupportedFormats = tmp;}sp<ExternalCameraDeviceSession> ExternalCameraDevice::createSession(diff --git a/camera/device/3.4/default/ExternalCameraUtils.cpp b/camera/device/3.4/default/ExternalCameraUtils.cpp
old mode 100644
new mode 100755
diff --git a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
old mode 100644
new mode 100755
index 341c62218..669a2bf68
--- a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
+++ b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraUtils.h
@@ -110,6 +110,7 @@ struct SupportedV4L2Format {uint32_t durationDenominator; // frame duration denominator. Ex: 30double getDouble() const; // FrameRate in double. Ex: 30.0};
+ double maxFramerate; //该补丁若代码中无对应的地方,可修改同级文件ExternalCameraUtils_3.4.h 的相应位置是一样的std::vector<FrameRate> frameRates;};--
2.17.1
此外,修改分辨率问题也可参考如下:
//显示更多拍照分辨率的 改应用代码里这个地方。private static List<Size> pickUpToThree(List<Size> sizes) {List<Size> result = new ArrayList<Size>();Size largest = sizes.get(0);if (largest.width() != 1920 || largest.height() != 1088)result.add(largest);Size lastSize = largest;for (Size size : sizes) {if (size != null && size.width() == 1920 && size.height() == 1088)continue;+ result.add(size);- double targetArea = Math.pow(.5, result.size()) * area(largest);+ /*double targetArea = Math.pow(.5, result.size()) * area(largest);if (area(size) < targetArea) {// This candidate is smaller than half the mega pixels of the// last one. Let's see whether the previous size, or this size// is closer to the desired target.if (!result.contains(lastSize)&& (targetArea - area(lastSize) < area(size) - targetArea)) {result.add(lastSize);} else {result.add(size);}}lastSize = size;if (result.size() == 3) {break;}}// If we have less than three, we can add the smallest size.if (result.size() < 3 && !result.contains(lastSize)) {result.add(lastSize);- }+ }*/return result;}
相关文章:

android11 usb摄像头添加多分辨率支持
部分借鉴于:https://blog.csdn.net/weixin_45639314/article/details/142210634 目录 一、需求介绍 二、UVC介绍 三、解析 四、补丁修改 1、预览的限制主要存在于hal层和framework层 2、添加所需要的分辨率: 3、hal层修改 4、frameworks 5、备…...

【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)
本文项目编号 T 020 ,文末自助获取源码 \color{red}{T020,文末自助获取源码} T020,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

JavaScript全面指南(二)
🌈个人主页:前端青山 🔥系列专栏:Javascript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南(二) 目录 21、说明如何使用JavaScript提交表单? 2…...

Nginx:Linux配置Nginx
目录 一、环境安装1.1 GCC编译器1.2 PCRE1.3 Zlib1.4 OpenSSL1.5 快速下载 二、Nginx源码简单安装2.1 下载安装包2.2 解压2.3 进入资源文件中2.4 编译、安装 三、Yum安装四、Nginx源码复杂安装4.1 参数介绍4.2 参数配置 五、卸载Nginx5.1 关闭Nginx进程5.2 将安装的Nginx删除5.…...

WebRTC音频 04 - 关键类
WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架 WebRTC音频 04 - 关键类(本文) 一、前言: 在WebRTC音频代码阅读过程中,我们发现有很多关键的类比较抽象,搞不清楚会导致代码阅读一脸懵逼。比如…...

Elasticsearch:Redact(编辑) processor
Redact 处理器使用 Grok 规则引擎来隐藏输入文档中与给定 Grok 模式匹配的文本。该处理器可用于隐藏个人身份信息 (Personal Identifying Information - PII),方法是将其配置为检测已知模式,例如电子邮件或 IP 地址。与 Grok 模式匹配的文本将被替换为可…...
O2OA结合备份脚本和定时任务进行数据库的备份,我们以MySQL数据库为例
概述 系统运行一段时间后,可能发生各种情况导致数据丢失,如硬件故障、人为错误、软件错误、病毒攻击等。定期备份可以帮助您保护数据免受这些风险的影响,以便在需要时能够恢复数据。 O2OA应用本身可以通过dump配置每天自定备份数据ÿ…...
Python自动化办公:批量提取PDF中的表格到Excel
在现代办公环境中,处理大量的PDF文件并提取其中的表格数据是一项常见而繁琐的任务。手动复制粘贴不仅耗时耗力,还容易出错。Python作为一种功能强大的编程语言,提供了丰富的工具包,可以高效地解决这一问题。本文将介绍如何使用Pyt…...

selenium有多个frame页时的操作方法(5)
之前文章我们提到,在webdriver.WebDriver类有一个switch_to方法,通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页:http://www.sahitest.com/demo/framesTest.h…...

谷歌外链的周期性维护!
外链建设不是一次性的工作,它需要长期的维护和更新,才能持续为网站带来稳定的流量和SEO提升。很多网站在初期通过短期内大规模获取外链的方式,确实能看到排名的提升,但这种方法往往难以维持长期的效果。谷歌更喜欢自然、持续增长的…...
CATIA软件许可管理最佳实践
在当今的工程设计领域,CATIA软件已成为众多企业不可或缺的工具。然而,随着软件使用的广泛普及,许可管理变得尤为关键。本文将为您探讨CATIA软件许可管理的最佳实践,助您在确保合规性的同时,实现成本效益的最大化。 一、…...

大华智能云网关注册管理平台 SQL注入漏洞复现(CNVD-2024-38747)
0x01 产品简介 大华智能云网关注册管理平台是一款专为解决社会面视频资源接入问题而设计的高效、便捷的管理工具,平台凭借其高效接入、灵活部署、安全保障、兼容性和便捷管理等特点,成为了解决社会面视频资源接入问题的优选方案。该平台不仅提高了联网效率,降低了联网成本,…...

什么是思维导图,手把手教你做经典思维导图
在信息爆炸的时代,如何高效整理思绪、激发创意、提升学习效率成为了我们共同面临的挑战。思维导图,这一源自脑科学的思维工具,以其直观、灵活的特点,成为了众多学习者、管理者和创意人士的得力助手。今天,就让我们一起…...

使用GSEA读‘gmt文件‘时最后一行未遂问题解决
最近工作中,使用GSEA网站自定义库下载的gmt文件用函数读取的时候报错: 这种问题在文本文件读取中经常出现,往往因为最后一行未留出/n,也就是最后一行没有换行留出空行。 可以使用notepad打开gmt文件: 发现果然最后一行…...

C++中vector常用函数总结
一,vector vector可以理解为一个边长数组,可以存储不同的类型,int ,double,char,结构体等。 也可以才能出STL标准容器,如set,string,vector等 二,构造函数 vector(size_t n,T val) …...

手撕数据结构 —— 队列(C语言讲解)
目录 1.什么是队列 2.如何实现队列 3.队列的实现 Queue.h中接口总览 具体实现 结构的定义 初始化 销毁 入队列 出队列 取队头元素 取队尾元素 判断是否为空 获取队列的大小 4.完整代码附录 Queue.h Queue.c 1.什么是队列 队列是一种特殊的线性表࿰…...

Java知识巩固(五)
目录 基本数据类型 基本类型和包装类型的区别? 自动装箱与拆箱了解吗?原理是什么? 为什么浮点数运算的时候回邮精度丢失的风险? 如何解决浮点数运算的精度丢失问题? 超过 long 整型的数据应该如何表示? 基本数据…...
C# 中 yield关键字的使用
yield return有以下优点: 每次迭代时生成一个值,并且在下次迭代时继续从上次离开的地方开始。 延迟执行:只有在实际需要时才会生成下一个值,这对于处理大量数据非常有用。 节省内存:不需要一次性将所有数据加载到内存中…...
YoloDotNet 的基本使用方法详解
文章目录 一、创建项目与引用库二、模型加载与初始化三、图像数据的处理与输入四、目标检测结果的获取与解析五、性能优化与参数调整一、创建项目与引用库 在使用 YoloDotNet 之前,首先需要在开发环境中创建一个新的项目。可以选择使用 Visual Studio 等开发工具,创建一个 C#…...
0x12 Dapr Dashboard configurations 未授权访问漏洞 CVE-2022-38817
参考: Dapr Dashboard configurations 未授权访问漏洞 CVE-2022-38817 | PeiQi文库 (wgpsec.org)免责声明 欢迎访问我的博客。以下内容仅供教育和信息用途: 合法性:我不支持或鼓励非法活动。请确保遵守法律法规。信息准确性:尽管我尽力提供准确的信息,但不保证其完全准确…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...