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

Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用

Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用

牵牛老人 已于 2025-07-25 09:24:54 修改 阅读量645 收藏 10 点赞数 11
文章链接:https://blog.csdn.net/qianniulaoren/article/details/149138758

一:USB摄像头开发基础与框架

1.1 QtMultimedia的优势与局限​

跨平台兼容性​:通过QCamera类统一控制摄像头,Windows/Linux/macOS接口一致。3行代码就能实现摄像头启动,示例如下:

QCamera *camera = new QCamera(QCameraInfo::availableCameras().first());
QCameraViewfinder *viewfinder = new QCameraViewfinder(this);
camera->setViewfinder(viewfinder); camera->start();

局限性​:
无法直接访问原始视频流(YUV数据需通过QCameraImageCapture间接获取);
分辨率/帧率控制依赖设备驱动,部分参数设置受限。

1.2 V4L2在Windows的融合方案​

V4L2的Linux特性​:原生支持DMA缓冲和视频流控制(如ioctl(VIDIOC_REQBUFS))
​Windows适配方案​:
​双架构驱动层​:Linux使用原生V4L2,Windows通过libusb+WinUSB模拟设备节点.
​数据桥接设计​:
USB Camera ——> libusb/WinUSB——> 虚拟/dev/video0节点——>V4L2兼容层——>Qt应用程序

二:V4L2驱动层视频流捕获与DMA优化​(3000字)

2.1 V4L2视频采集​

2.1.1 ​设备初始化:
int fd = open("/dev/video0", O_RDWR); // Windows需映射为COM设备
struct v4l2_format fmt = {0};
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 1280; 
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; // 指定YUV格式
ioctl(fd, VIDIOC_S_FMT, &fmt); // 设置格式
2.1.2 ​​DMA缓冲池配置​
//零拷贝的关键
struct v4l2_requestbuffers req = {0};
req.count = 4;  // 设置4重缓冲防帧撕裂
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP; // DMA内存映射
ioctl(fd, VIDIOC_REQBUFS, &req);

2.2 性能优化三要素​

内存对齐​:DMA缓冲区需64字节对齐(ARM架构硬性要求)

void* buf = _aligned_malloc(buffer_size, 64); // Windows专用对齐分配

双缓冲队列​:生产者-消费者模型避免阻塞

QQueue<v4l2_buffer> readyQueue; // 就绪帧队列
QQueue<v4l2_buffer> processingQueue; // 处理中队列

异步通知机制​:通过epoll监控设备文件描述符(Linux用法)或WaitForSingleObject(Windows方法)

三:QtMultimedia视频显示与控件集成

3.1 QVideoWidget显示流水线​

原始帧拦截​:写一个继承自QAbstractVideoSurface的控件,并重写present()函数。

class CustomVideoSurface : public QAbstractVideoSurface {
public:bool present(const QVideoFrame &frame) {QVideoFrame cloneFrame(frame); // 复制帧避免锁emit frameReady(cloneFrame); // 发送信号return true;}
};

控件绑定​:使用QVideoWidget作为显示载体

QVideoWidget *videoWidget = new QVideoWidget(this);
camera->setViewfinder(videoWidget); // 标准显示

3.2 多摄像头管理​

设备枚举​:用QCameraInfo::availableCameras()获取设备列表;
​多实例控制​:每个摄像头独立线程防止阻塞;

QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
foreach (const QCameraInfo &info, cameras) {QThread *thread = new QThread;CameraWorker *worker = new CameraWorker(info);worker->moveToThread(thread);connect(thread, &QThread::started, worker, &CameraWorker::start);
}

四:YUV转RGB算法在Qt中的高效实现​

4.1 转换算法原理​

YUV格式差异:

格式 数据排列 应用场景
YUYV YU/YV 交替存储 主流USB摄像头
NV12 Y平面+UV交错 安卓/GPU处理

转换公式​:
R = Y + 1.402 * (V-128)
G = Y - 0.344 * (U-128) - 0.714 * (V-128)
B = Y + 1.772 * (U-128)

4.2 Qt中的三种加速方案​

(1)使用​SSE指令集优化​后提速好几倍,摘下来一段核心代码:

__m128i yuv = _mm_loadu_si128((__m128i*)src); 
__m128i rgb = _mm_adds_epi16(_mm_mulhi_epi16(yuv, coeffY), _mm_mulhi_epi16(uv, coeffUV));
_mm_store_si128((__m128i*)dst, rgb);

(2)OpenCL GPU加速​:适合4K视频;
​(3)QImage直接转换​:简易但效率低(仅适用于低分辨率);

QImage image(yuv_data, width, height, QImage::Format_YUV444);
image = image.convertToFormat(QImage::Format_RGB888);

五:完整案例核心代码说明

以1080P摄像头采集系统​的核心代码模块​说明:

5.1 V4L2驱动层视频捕获(零拷贝优化)​

// v4l2_capture.h
#include <linux/videodev2.h>
#include <sys/mman.h>struct v4l2_buffer_info {void* start;size_t length;
};class V4L2CaptureThread : public QThread {Q_OBJECT
public:explicit V4L2CaptureThread(QObject *parent = nullptr): QThread(parent), fd(-1) {}bool initV4L2(const char* device = "/dev/video0", int width = 1920, int height = 1080) {fd = open(device, O_RDWR);if (fd < 0) { qWarning("Device open failed"); return false; }// 设置采集格式(YUYV)struct v4l2_format fmt = {};fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmt.fmt.pix.width = width;fmt.fmt.pix.height = height;fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; // 兼容多数USB摄像头[6](@ref)if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) { /* 错误处理 */ }// DMA缓冲池配置(4重缓冲防撕裂)struct v4l2_requestbuffers req = {};req.count = 4;req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;req.memory = V4L2_MEMORY_MMAP; // 零拷贝关键[6,8](@ref)if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) { /* 错误处理 */ }// 内存映射for (int i = 0; i < 4; ++i) {struct v4l2_buffer buf = {};buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;buf.index = i;if (ioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) { /* 错误处理 */ }buffers[i].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);buffers[i].length = buf.length;// 入队缓冲区ioctl(fd, VIDIOC_QBUF, &buf);}return true;}protected:void run() override {// 启动视频流enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;ioctl(fd, VIDIOC_STREAMON, &type);while (!isInterruptionRequested()) {fd_set fds;FD_ZERO(&fds);FD_SET(fd, &fds);select(fd + 1, &fds, NULL, NULL, NULL); // 阻塞等待数据struct v4l2_buffer buf = {};buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buf.memory = V4L2_MEMORY_MMAP;ioctl(fd, VIDIOC_DQBUF, &buf); // 取出就绪帧// 将YUV数据转换为RGB(使用SSE加速)QImage image = convertYUYVtoRGB((uchar*)buffers[buf.index].start, 1920, 1080);emit frameReady(image); // 发送帧数据ioctl(fd, VIDIOC_QBUF, &buf); // 重新入队}}signals:void frameReady(const QImage &image);private:int fd;v4l2_buffer_info buffers[4];
};

5.2 用QtMultimedia显示模块(跨平台适配)​

// camera_display.cpp
#include <QCamera>
#include <QVideoWidget>class CameraDisplay : public QWidget {
public:CameraDisplay(QWidget *parent = nullptr) {// Windows使用QtMultimedia直接控制摄像头[1,4](@ref)#if defined(Q_OS_WIN)QList<QCameraDevice> cameras = QMediaDevices::videoInputs();if (!cameras.empty()) {m_camera = new QCamera(cameras.first());m_videoWidget = new QVideoWidget(this);m_camera->setVideoOutput(m_videoWidget);m_camera->start();}// Linux使用V4L2线程#elif defined(Q_OS_LINUX)m_captureThread = new V4L2CaptureThread(this);connect(m_captureThread, &V4L2CaptureThread::frameReady, this, [this](const QImage &img) {m_displayLabel->setPixmap(QPixmap::fromImage(img));});m_captureThread->start();#endif}// 截图功能(带时间戳命名)void captureImage() {QDateTime time = QDateTime::currentDateTime();QString fileName = time.toString("yyyyMMdd_hhmmss") + ".jpg";m_currentFrame.save(fileName); // m_currentFrame从frameReady更新[4,8](@ref)}private:QCamera *m_camera = nullptr;QVideoWidget *m_videoWidget = nullptr;V4L2CaptureThread *m_captureThread = nullptr;QLabel *m_displayLabel = nullptr; // Linux下替代QVideoWidget
};

5.3 YUV转RGB算法(SSE4.1加速)​

// yuv_converter.cpp
#include <immintrin.h>QImage convertYUYVtoRGB(uchar *yuyv, int width, int height) {QImage rgbImage(width, height, QImage::Format_RGB888);uchar *rgb = rgbImage.bits();for (int y = 0; y < height; ++y) {__m128i *src = (__m128i*)(yuyv + y * width * 2);__m128i *dst = (__m128i*)(rgb + y * width * 3);for (int x = 0; x < width / 2; ++x) { // 每次处理2个像素__m128i yuyvData = _mm_load_si128(src++);// YUV分离(YUYV格式:Y0 U0 Y1 V0)__m128i y = _mm_and_si128(yuyvData, _mm_set1_epi16(0x00FF));__m128i u = _mm_srli_epi16(_mm_and_si128(yuyvData, _mm_set1_epi16(0xFF00)), 8);__m128i v = _mm_srli_epi16(_mm_and_si128(yuyvData, _mm_set1_epi16(0xFF000000)), 24);// 转换公式:R = Y + 1.402*(V-128)__m128i r = _mm_add_epi16(y, _mm_mulhi_epi16(_mm_sub_epi16(v, _mm_set1_epi16(128)), _mm_set1_epi16(918)));// 其他通道计算类似...// 结果饱和处理(0-255范围)r = _mm_min_epi16(_mm_max_epi16(r, _mm_setzero_si128()), _mm_set1_epi16(255));// 打包RGB数据并存储__m128i rgb1 = _mm_packus_epi16(/* R,G,B通道组合 */);_mm_store_si128(dst++, rgb1);}}return rgbImage;
}

六:进阶处理:集成其他应用库

6.1OpenCVDNN实时分析

cv::dnn::Net net = cv::dnn::readNet("yolov5n.onnx");
QCameraImageCapture capture(camera);
connect(&capture, &QCameraImageCapture::imageCaptured, [&](int id, QImage img){cv::Mat frame = cv::Mat(img.height(), img.width(), CV_8UC3, img.bits());net.setInput(frame);cv::Mat detections = net.forward();
});

6.2 OpenCV层输出可视化

// 获取中间层输出
std::vector<String> layerNames = net.getLayerNames();
std::vector<Mat> outputs;
net.forward(outputs, layerNames[10]);
imshow("FeatureMap", outputs[0]);

相关文章:

Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用

Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用牵牛老人 已于 2025-07-25 09:24:54 修改 阅读量645 收藏 10 点赞数 11 文章链接:https://blog.csdn.net/qianniulaoren/article/details/149138758一:USB摄像头开发基础与框架 1.1 QtMultimedia的优势与局限​ 跨平台兼…...

详细介绍:C++(静态函数)

详细介绍:C++(静态函数)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-siz…...

2025.9.15日软件工程学习日志

HBase科技成果管理系统设计与实现 今日设计一个基于HBase的科技成果信息填报系统。 系统分析与设计思路 前端需要实现科技成果信息填报表单,包含多种输入类型和验证 后端使用HBase作为数据库存储数据 需要实现数据的增删改查功能 成果编号需要按规则自动生成 HBase表设计: 表…...

RocketMQ快速实战及核心概念

RocketMQ学习笔记 一、MQ简介 MQ定义MQ:Message Queue,消息队列Message:消息,不同进程之间传递的数据Queue:队列,具有FIFO(先进先出)特性,用于缓存数据广义上,只要能实现消息跨进程传输及队列数据缓存,都可称为消息队列MQ的作用异步例子:快递员发快递,先放到菜鸟驿站…...

【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)

【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

为什么不建议在 Docker 中跑 MySQL?

前言 今天我们来聊聊一个很有趣的话题:为什么我不建议在Docker中运行MySQL数据库? 有些小伙伴在工作中可能为了部署方便,习惯将所有组件都容器化,但数据库真的适合放在容器里吗? 今天就专门跟大家一起聊聊这个话题,希望对你会有所帮助。 一、容器化与数据库:天生的矛盾?…...

reLeetCode 热题 100-1 指针283. 移动零 - MKT

reLeetCode 热题 100-1 指针283. 移动零 class Solution { public:void moveZeroes(vector<int>& nums) {// int cout_=0;// for(int i =0; i<nums.size();i++){// if(nums[i]==0){// cout_++;// }// }// std::cout<< " 0s all …...

解决c# DocX生成的word文档wps打开排版外边距错乱微软office正常问题

public void insertBreak(DocX document, String filename) { DocX tempDocx = DocX.Create(filename); setPageMargin(tempDocx); document.InsertDocument(tempDocx);document.InsertSectionPageBreak(true); }改为public vo…...

The 2025 ICPC Asia East Continent Online Contest (II)

The 2025 ICPC Asia East Continent Online Contest (II)比赛链接 Review 这场非常有参与感哈哈,因为我签到题 C 贪心写了两小时,中间下机若干次让队友过题,写完已经完全不知道队友进度是啥了,后续就当小黄鸭被带飞了哈哈。 Solution C. Jiaxun! 那我确实需要 jiaxun 额额贪…...

工厂方法模式(Factory Method) - 指南

工厂方法模式(Factory Method) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

拾忆录

████,也即言多██,就是少点██,不容易发生██——来自于多种████的通理 择一███,遇一人██——收集自███,████ 知行合一心学理论——王阳明...

从零搭建RAG应用:跳过LangChain,掌握文本分块、向量检索、指代消解等核心技术实现

RAG(检索增强生成)本质上就是给AI模型外挂一个知识库。平常用ChatGPT只能基于训练数据回答问题,但RAG可以让它查阅你的专有文档——不管是内部报告、技术文档还是业务资料,都能成为AI的参考资源。 很多人第一反应是用LangChain或LlamaIndex这些现成框架,确实能快速搭起来。…...

python高阶技巧

闭包:在函数嵌套前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数叫做闭包 简单闭包: def outer(logo): def inner(msg): print(f"<{logo}>{msg}>{logo}") return inner fn1=outer("黑马程…...

机器视觉之图像处理篇 - 指南

机器视觉之图像处理篇 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-s…...

尝试hikari和jdbctemplate

试着基于jdbctemplate包装一个MysqlHelper类。连接池采用springboot默认的hikari。jdbctemplate提供基本的防注入,它的写法比jdbc好看,jdbc还需要putint,putstr。提供的另一个功能是结果集的转换。写完,测试代码的面貌如下:var sqlhp = new SqlHelper();sqlhp.configAddress…...

配置Nginx根据IP地址进行流量限制以及返回JSON格式数据

要在Nginx中根据IP地址进行流量限制并返回JSON格式数据,你需要结合Nginx的 ngx_http_limit_req_module模块和一些配置技巧。这个模块允许你基于定义的键值,比如IP地址,限制请求的速率。不过在进入细节前,别忘了备份你的Nginx配置文件 划重点:配置透视战斗护甲 (limit_req_…...

回归

最近因为████导致██发生████,长期的██也不是办法,我决定以███████发文。 我的很多比如███,███都发生了██,所以██的██████视█。 重新██...

CSS纯文本渐变动效

创建一个令人印象深刻的CSS文本渐变动效就像是在文字上施展魔法。想象你的文字就像是一幅幻灯片,色彩在背后流转,让每个字母都像是被彩虹绘制过一样。 为了让这种魔法发生,你需要进入CSS的巫术领地。我们将把渐变动效的制作分解为简单步骤,这样即使你不是CSS的大师,也能轻…...

泛微流程共享

第一步: 第二步:打开合同审批数据,点击右键,选择共享。 第三步:共享权限的查看,可见Giada没有查看权限。 第四步:添加权限,依次进入下面的选项。...

MySQL报错:未知系统变量tx_isolation及隔离级别查询

MySQL在其各个版本中进行了诸多变更和优化,包括系统变量、参数命名、功能等方面的调整。在这个情况中,遇到“未知系统变量tx_isolation”这个错误是因为在MySQL 8.0及以后的版本中,系统变量 tx_isolation已经被重命名为 transaction_isolation。 如果你像老朋友一样寻找 tx_…...

Redssion

1.使用 // 设置锁定资源名称 RLock disLock = redissonClient.getLock("DISLOCK"); //尝试获取分布式锁 boolean isLock= disLock.tryLock(500, 15000, TimeUnit.MILLISECONDS); if (isLock) {try {//TODO if get lock success, do something;Thread.sleep(15000);} …...

if __name__ == __main__:

if __name__ == "__main__": 是 Python 中的一个标准代码块,用于检查一个脚本是否是直接运行的。 工作原理 当一个 Python 脚本被解释器执行时,它会自动定义一些特殊变量。其中一个就是 __name__。如果脚本是直接运行的,Python 会将 __name__ 变量的值设置为 &quo…...

提升系统可靠性:Air8000多串口硬件设计的黄金法则

串口通信的可靠性直接影响工业系统的连续性。Air8000以多串口工业级连接力赋能设备互联,而硬件设计则是其可靠性的根基。总结黄金法则,从信号隔离、阻抗匹配到热设计,全方位保障串口通信的稳定性与安全性。 本文主要从硬件设计的角度,分享串口设计中的一些关键注意点,软件…...

20250915笔记

svn 版本控制工具 一、svn介绍 二、svn安装 1、下载客户端和服务端 安装流程: (1)先安装服务端 (2)在服务端创建仓库 (3)新建用户,新建用户组 (4)设置权限,服务端安装成功 (5)安装客户端(也叫小乌龟) (6)安装桌面右键连接仓库 (7)输入账号和密码 (8)连接…...

enumerate函数

enumerate() 是 Python 中一个非常实用的内置函数,它用于在遍历一个可迭代对象(如列表、元组、字符串等)的同时,获取每个元素的索引和值。 为什么需要 enumerate()? 在没有 enumerate() 之前,如果你想同时获取索引和值,通常需要手动维护一个计数器: fruits = [apple, b…...

2025国内 HR SaaS 竞争格局:易路以AI深度融合引领行业转型

在中国企业数智化转型的浪潮中,HR SaaS 市场正经历从基础数字化向智能协同的关键跃迁。随着全球化布局与本地化合规要求的双重驱动,中大型企业对人力资源管理系统的需求已从单一模块效率提升转向全流程智能协同与全球合规管理。截至 2025 年,中国 HR SaaS 市场规模已突破 30…...

HyperWorks许可激活

在工程项目中,高效的软件工具是成功的关键。而一个顺畅的许可激活流程,则是确保这些工具能够迅速投入使用的重要环节。HyperWorks,作为一款领先的工程仿真软件,以其快速、简便的许可激活流程,为用户提供了卓越的使用体验。 一、一键激活,轻松上手 HyperWorks的许可激活流…...

f-string用法

在 Python 3.6 及更高版本中,在字符串前加上一个 f,表示这是一个 f-string(格式化字符串字面量)。 f-string 的主要作用是让你在字符串中嵌入 Python 表达式,使得格式化字符串变得非常简洁和直观。 f-string 的基本用法 你只需要在字符串开头加上 f,然后在字符串内部用花…...

OpenStack Nova instance 常见操作

1. 启动实例(start) 场景:启动处于 SHUTOFF 状态的实例 源码路径:API 层:nova/compute/api.py → start() RPC 层:nova/compute/rpcapi.py → start_instance() 执行层:nova/compute/manager.py → start_instance() 驱动层:nova/virt/libvirt/driver.py → power_on()…...

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…...

理解 Kubernetes CSI

关于 Kubernetes CSI,现在的资料已经不少,但我仍希望有一篇文档能让人轻松但不失准确地理解 CSI。 本文不涉及代码分析和详细设计。但需要如下基础:会使用至少一种容器,Docker,containerd,Kata 之类的都可以。 protobuf 和 gRPC:会用并有少量的开发经验,会用某种语言(…...

9.15

开学...

常用数学定理公式

二项式定理 \[(x + y)^n = \sum_{k=0}^n \binom{n}{k} x^{n-k} y^k \]...

线性规划

线性规划是求一个线性函数在满足一组线性等式或不等式方程条件下极值的一类数学问题的统称。要求目标函数和约束方程必须是线性函数。隐含了如下假定:  比例性假定:决策变量的变化与资源消耗成比例;  可加性假定:每个决策变量的影响独立于其他变量;  连续性假定:决…...

伪代码学习总结

伪代码学习总结 1. 什么是伪代码伪代码(Pseudocode) 是一种 算法描述语言。它既不同于自然语言(太模糊),也不是某种具体编程语言(太依赖语法)。使用伪代码的目的:使被描述的算法可以容易地翻译成任何一种编程语言(如 Pascal, C, Java, Python 等); 要求 结构清晰、可…...

20号胶 2511

...

9.13linux系统命令

Linux2系统命令 1、df 查看磁盘使用情况 (1)df 查看磁盘使用情况 Filesystem:代表该文件系统时哪个分区,所以列出的是设备名称。 1K-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变单位大小,也可以用-B来设置。 Used:已经使用的空间大小。Available:剩余的空间…...

9.15 svn git

svn版本控制工具 一、svn介绍 SVN是subversion的简称 是一个开放源代码的版本控制系统,通过采用分支管理系统的高 效管理,简而言之就是用于多个人共同开发同一个项目,实现共 享资源,实现最终集中式的管理。 SVN的作用:在项目组当中对需求规格说明书、测试用例、产品 说明书…...

PVC2601

...

利用RabbitMQ与Redis实现消息的延迟传递的策略

RabbitMQ:时间控的快递中心 让我们从RabbitMQ开始,RabbitMQ拥有一个叫做“Dead Letter Exchanges”(DLX)的机制,这个机制基本上就是一个失物招领处。当一个消息未能及时被送达,RabbitMQ会将它转移至DLX。这个DLX与一个或多个队列关联,这样就能处理这些失去方向的消息了。…...

python 按excel的经纬度提取对应栅格tif文件的数值

栅格文件 批量处理代码:# -*- coding:utf-8 -*- """ @author: suyue @file: extract_stations_from_excel.py @time: 2025/09/09 @desc: 从Excel读取站点信息并提取所有站点的CTT值 """ import rasterio import numpy as np import pandas as p…...

麒麟

麒麟点击跳转...

实现我的第一个本地文档问答机器人

本地文档问答机器人 下面是一个完整的本地文档问答机器人实现,涵盖了阶段三的所有核心概念:文档加载、文本分割、向量存储和检索增强生成(RAG)。 完整代码实现 import os.path from typing import Listfrom huggingface_hub import snapshot_download from langchain.chain…...

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", m…...

关于32位单片机使用lwip无法访问(ping)外网,只能与同网段设备进行通信的问题解决

核心问题:MAC地址 理论依据:MAC地址是有相应的规范的MAC地址中,前3字节为组织唯一标识符,后24位由厂家自行定义。也就是说前3字节是有规定的,其中前3字节MAC中的前几位也是有着对应的含义的。MAC地址详细的介绍,大家可以在网上搜得到 出现这个问题的核心就是网关对设备mac地…...

044-WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

044-WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式 1.演示案例:➢PHP-MYSQL-SQL操作-增删改查 ➢PHP-MYSQL-注入函数-布尔&报错&延迟 ➢PHP-MYSQL-注入条件-数据回显&错误处理 ➢PHP-MYSQL-CMS案例-插入报错&删除延迟…...

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案在实际的工程项目里,我们常常会面临这样的情况:项目管理者可能会决定使用多个品牌的视频监控摄像头,或者有需求将现有的、多种类型的监控系统进行整合。现在,让我们来探讨一下如何实现不同品牌摄像头的连接和使…...

离散数学课堂习题及课后习题 - PPX

课上的习题,不完整,有空再更新第二章 抽屉原理 Background: 简单形式: 把(n+1)个物体放入n个盒子,必有一个盒子中装了两个物体。其实这个也是狄利克雷描述的一个特殊的表述(如果对于一个映射$ X\to Y $ ,如果\(|X|>|Y|\),则\(f\)不可能是单射,也就是会有\(f(x_1)=f(x…...

玻璃2601

前期五浪下跌走完了 开启反弹...

GoFrame框架查询数据表时对字段取别名

两种方式,基于模型的Fields方法dao.User.Where("id",1).Fields("name as `nickname`","id as `uid`").All()基于结构体orm标签的映射关系type UserData struct {Uid int `json:"id" orm:"id"`Nickname string `json:"…...