视频监控实现画面缩放功能
文章目录
- 概要
- 一、功能说明
- 二、核心实现代码
- 三、技术细节
概要
在视频监控系统中,经常需要查看视频画面中的细节。通过实现区域放大、滚轮缩放和拖拽平移等功能,可以让用户更方便地观察视频细节。本文介绍如何在 Windows 系统下实现这些交互功能。
一、功能说明
框选缩放功能:按住鼠标左键,移动鼠标画出矩形框,松开左键,会将框选区域放大至整个窗口显示。点击鼠标右键,即恢复显示原画面。
鼠标滚轮缩放功能:通过鼠标滚轮控制缩放比例,以鼠标所在位置为中心进行缩放。
鼠标拖拽功能:在放大状态下,按住左键可以拖动视频画面,查看不同区域。
二、核心实现代码
// 检查区域
bool IsValidZoomRc(const RECT *pRC) {return pRC != nullptr && abs(pRC->left - pRC->right) > 4 && abs(pRC->top - pRC->bottom) > 4;
}// 左上右下位置相反时对调
inline void fmtRect(RECT &rc) {if (rc.left > rc.right) std::swap(rc.left, rc.right);if (rc.top > rc.bottom) std::swap(rc.top, rc.bottom);
}// 播放类
class CPlayer {// ...省略其他代码private:bool m_bZoom; // 是否启用缩放功能HANDLE m_hPlayer; // 调用播放库的句柄POINT m_ptDragStart; // 拖动起始点RECT m_rcDragStart; // 拖动开始时的显示区域AV_STREAM_INFO m_stStreamInfo; // 存放流信息的结构体RECT m_rcZoom; // 记录当前显示的画面区域RECT m_rcDrawRect; // 用于画框// 在播放库回调出来的句柄上画框选的方框void OnVideoDraw(HANDLE handle, HDC hdc) {if (m_bZoom) {auto oldPen = SelectObject(hdc, m_hDrawPen);auto oldBrush = SelectObject(hdc, m_hDrawBrush);Rectangle(hdc, m_rcDrawRect.left, m_rcDrawRect.top, m_rcDrawRect.right, m_rcDrawRect.bottom);SelectObject(hdc, oldPen);SelectObject(hdc, oldBrush);}}// 画框缩放接口void DoZoom(int wndWidth, int wndHeight, const RECT *pRc, bool bLRButtonUp) {if (!m_bZoom && m_hPlayer != (void*)INFINITE) {HS_ShowRect(m_hPlayer, nullptr); // 调用播放库接口,还原画面return;}if (pRc != nullptr) {// 如果画面已经处于放大状态,不再支持画框if (((m_rcZoom.right - m_rcZoom.left) != m_stStreamInfo.nWidth) ||((m_rcZoom.bottom - m_rcZoom.top) != m_stStreamInfo.nHeight)) {return;}}if (bLRButtonUp || pRc == nullptr) {ZeroMemory(&m_rcDrawRect, sizeof(m_rcDrawRect));} else {m_rcDrawRect = *pRc;}double fWndWidth = wndWidth;double fWndHeight = wndHeight;if (bLRButtonUp) {if (pRc == nullptr) {if (m_hPlayer != (void*)INFINITE) {HS_ShowRect(m_hPlayer, nullptr);}SetRect(&m_rcZoom, 0, 0, m_stStreamInfo.nWidth, m_stStreamInfo.nHeight);} else {RECT rc = m_rcZoom, rcPrm = *pRc;double fWidth = (double)fWndWidth / abs(m_rcZoom.left - m_rcZoom.right),fHeight = (double)fWndHeight / abs(m_rcZoom.top - m_rcZoom.bottom);fmtRect(rcPrm);rc.left += (LONG)floor((double)rcPrm.left / fWidth);rc.right = rc.left + (LONG)floor((double)abs(rcPrm.left - rcPrm.right) / fWidth);rc.top += (LONG)floor((double)rcPrm.top / fHeight);rc.bottom = rc.top + (LONG)floor((double)abs(rcPrm.top - rcPrm.bottom) / fHeight);if (m_hPlayer != (void*)INFINITE) {bool bRet = IsValidZoomRc(&rc) && 0 == HS_ShowRect(m_hPlayer, &rc); // 将要显示的区域传给播放库if (bRet) {m_rcZoom = rc;}}} }}// 鼠标滚轮缩放接口void DoWheelZoom(POINT ptMouse, int wndWidth, int wndHeight, short zDelta) {if (!m_bZoom || m_hPlayer == (void*)INFINITE) {return;}// 计算缩放比例 - 每次放大20%或缩小25%double scale = (zDelta > 0) ? 0.8 : 1.25;// 当前视频显示区域的宽高int currentWidth = m_rcZoom.right - m_rcZoom.left;int currentHeight = m_rcZoom.bottom - m_rcZoom.top;// 新的视频显示区域宽高int newWidth = (int)(currentWidth * scale);int newHeight = (int)(currentHeight * scale);if (zDelta > 0) {// 这里控制最多放大11次double minWidth = m_stStreamInfo.nWidth * pow(scale, 12);if (newWidth < minWidth) {return;}} else {// 这里控制只能缩小到视频原宽高if (newWidth > m_stStreamInfo.nWidth ||newHeight > m_stStreamInfo.nHeight) {newWidth = m_stStreamInfo.nWidth;newHeight = m_stStreamInfo.nHeight;}}// 计算鼠标在窗口坐标系中的相对位置(0-1范围)double mouseXRatio = ptMouse.x / (double)wndWidth;double mouseYRatio = ptMouse.y / (double)wndHeight;// 计算新的视频缩放区域,以鼠标位置为中心点RECT rcNew = {};int widthDiff = currentWidth - newWidth;int heightDiff = currentHeight - newHeight;rcNew.left = m_rcZoom.left + (int)(widthDiff * mouseXRatio);rcNew.top = m_rcZoom.top + (int)(heightDiff * mouseYRatio);rcNew.right = rcNew.left + newWidth;rcNew.bottom = rcNew.top + newHeight;// 确保不会超出视频边界if (rcNew.left < 0) {rcNew.right -= rcNew.left;rcNew.left = 0;}if (rcNew.top < 0) {rcNew.bottom -= rcNew.top;rcNew.top = 0;}if (rcNew.right > m_stStreamInfo.nWidth) {rcNew.left -= (rcNew.right - m_stStreamInfo.nWidth);rcNew.right = m_stStreamInfo.nWidth;}if (rcNew.bottom > m_stStreamInfo.nHeight) {rcNew.top -= (rcNew.bottom - m_stStreamInfo.nHeight);rcNew.bottom = m_stStreamInfo.nHeight;}// 应用新的缩放区域if (IsValidZoomRc(&rcNew)) {HS_ShowRect(m_hPlayer, &rcNew);m_rcZoom = rcNew;}}// 拖拽画面接口void DragMoveZoom(POINT ptMouse, int wndWidth, int wndHeight, bool bLBtnDown) {if (!m_bZoom || m_hPlayer == (void*)INFINITE) {return;}if (bLBtnDown) { // 鼠标左键按下事件m_ptZoomDragStart = ptMouse;m_rcZoomDragStart = m_rcZoom;}// 画面未处于放大状态,不支持拖拽if (((m_rcZoom.right - m_rcZoom.left) == m_stStreamInfo.nWidth) &&((m_rcZoom.bottom - m_rcZoom.top) == m_stStreamInfo.nHeight)) {return;}// 计算鼠标移动的距离int deltaX = m_ptZoomDragStart.x - ptMouse.x;int deltaY = m_ptZoomDragStart.y - ptMouse.y;// 根据窗口和实际视频的比例计算实际需要移动的距离double scaleX = (double)(m_rcZoom.right - m_rcZoom.left) / wndWidth;double scaleY = (double)(m_rcZoom.bottom - m_rcZoom.top) / wndHeight;// 计算实际移动距离int actualDeltaX = (int)(deltaX * scaleX);int actualDeltaY = (int)(deltaY * scaleY);// 计算新的显示区域RECT rcNew = m_rcZoomDragStart;rcNew.left += actualDeltaX;rcNew.right += actualDeltaX;rcNew.top += actualDeltaY;rcNew.bottom += actualDeltaY;// 边界检查if (rcNew.left < 0) {rcNew.right -= rcNew.left;rcNew.left = 0;}if (rcNew.top < 0) {rcNew.bottom -= rcNew.top;rcNew.top = 0;}if (rcNew.right > m_stStreamInfo.nWidth) {rcNew.left -= (rcNew.right - m_stStreamInfo.nWidth);rcNew.right = m_stStreamInfo.nWidth;}if (rcNew.bottom > m_stStreamInfo.nHeight) {rcNew.top -= (rcNew.bottom - m_stStreamInfo.nHeight);rcNew.bottom = m_stStreamInfo.nHeight;}// 应用新的显示区域if (IsValidZoomRc(&rcNew)) {HS_ShowRect(m_hPlayer, &rcNew);m_rcZoom = rcNew;}}// ...省略其他代码
};// 窗口类
class CPlayWnd {// ...省略其他代码private:RECT m_arrBlock; // 记录框选的区域bool m_bLBottonDowned; // 记录鼠标左键是否处于按下状态int m_nWndWidth;int m_nWndHeight;public:// 窗口事件响应函数LRESULT ChildWinMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg) {// ...省略其他代码case WM_LBUTTONDOWN: {m_bLBottonDowned = true;// SetCapture(hWnd); // 捕获鼠标POINT ptMouse = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };auto &rc = m_arrBlock;rc.left = rc.right = LOWORD(lParam);rc.top = rc.bottom = HIWORD(lParam);/* 这里通知播放类CPlayer,调用到CPlayer的缩放和拖拽接口 *//* OnDoZoom(m_nWndWidth, m_nWndHeight, &rc, false); *//* OnDragZoom(m_nWndWidth, m_nWndHeight, ptMouse, true); */} break;case WM_MOUSELEAVE: {if (m_bLBottonDowned) {m_bLBottonDowned = false;auto &rc = m_arrBlock;/* 这里通知播放类CPlayer,调用到CPlayer的缩放接口 *//* OnDoZoom(m_nWndWidth, m_nWndHeight, &rc, true); */}} break;case WM_MOUSEMOVE: {// 设置捕获鼠标离开窗口事件TRACKMOUSEEVENT trackEvent;trackEvent.cbSize = sizeof(TRACKMOUSEEVENT);trackEvent.dwFlags = TME_LEAVE;trackEvent.hwndTrack = hWnd;TrackMouseEvent(&trackEvent);if (m_bLBottonDowned) {POINT ptMouse = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };auto &rc = m_arrBlock;rc.right = LOWORD(lParam);rc.bottom = HIWORD(lParam);/* 这里通知播放类CPlayer,调用到CPlayer的缩放和拖拽接口 *//* OnDoZoom(m_nWndWidth, m_nWndHeight, &rc, false); *//* OnDragZoom(m_nWndWidth, m_nWndHeight, ptMouse, false); */}} break;case WM_MOUSEWHEEL: {POINT ptMouse;// 鼠标在屏幕的坐标ptMouse.x = GET_X_LPARAM(lParam);ptMouse.y = GET_Y_LPARAM(lParam);// 转换为相对于窗口的坐标ScreenToClient(hWnd, &ptMouse);// 获取滚轮delta值short zDelta = GET_WHEEL_DELTA_WPARAM(wParam);/* 这里通知播放类CPlayer,调用到CPlayer的滚轮缩放接口 *//* OnWheelZoom(ptMouse, m_nWndWidth, m_nWndHeight, zDelta); */} break;case WM_LBUTTONUP: {if (m_bLBottonDowned) {// ReleaseCapture(); // 释放鼠标捕获m_bLBottonDowned = false;auto &rc = m_arrBlock;rc.right = LOWORD(lParam);rc.bottom = HIWORD(lParam);/* 这里通知播放类CPlayer,调用到CPlayer的缩放接口 *//* OnDoZoom(m_nWndWidth, m_nWndHeight, &rc, true); */}} break;case WM_RBUTTONUP: {/* 这里通知播放类CPlayer,调用到CPlayer的缩放接口 *//* OnDoZoom(0, 0, nullptr, true); */} break;case WM_LBUTTONDBLCLK: {/* 这里通知播放类CPlayer,调用到CPlayer的缩放接口 *//* OnDoZoom(0, 0, nullptr, true); */} break;// ...省略其他代码}}// ...省略其他代码
};
三、技术细节
- 本文主要介绍的是如何计算出显示区域,计算出来后将结果传给播放库去显示,播放库代码不在本文展示
- 使用
GET_X_LPARAM
和GET_Y_LPARAM
替代LOWORD
和HIWORD
处理坐标 - 正确处理屏幕坐标到客户区坐标的转换
- 不使用
SetCapture
时,鼠标移出窗口后消息中断,拖动操作可能无法正常完成 - 使用
SetCapture
后,可以跟踪整个拖动过程,即使鼠标移出窗口也能继续操作
相关文章:
视频监控实现画面缩放功能
文章目录 概要一、功能说明二、核心实现代码三、技术细节 概要 在视频监控系统中,经常需要查看视频画面中的细节。通过实现区域放大、滚轮缩放和拖拽平移等功能,可以让用户更方便地观察视频细节。本文介绍如何在 Windows 系统下实现这些交互功能。 一、…...
通信综合—8.通信网络安全
一、信息系统安全概述 1.信息系统的构成和分类 信息系统是将用于收集、处理、存储和传播信息的部件组织在一起而成的相关联的整体,般是由计算机硬件、网络和通信设备、计算机软件、信息资源和信息用户组成。它是以处理信息流为目的的人机一体化系统。信息系统主要…...
keepalived双机热备方案实现Nginx高可用
问题描述 只用一台Nginx做反向代理,如果这台Nginx出现故障(比如宕机),则服务不可用。 以下给出keepalived双机热备方案实现Nginx高可用的方法。先介绍几个概念: 高可用 高可用(High Availability)是指系统或服务能…...
数据结构——排序算法第一幕(插入排序:直接插入排序、希尔排序 选择排序:直接选择排序,堆排序)超详细!!!!
文章目录 前言一、排序1.1 概念1.2 常见的排序算法 二、插入排序2.1 直接插入排序2.2 希尔排序希尔排序的时间复杂度 三、选择排序3.1 直接选择排序3.2 堆排序 总结 前言 时间很快,转眼间已经到数据结构的排序算法部分啦 今天我们来学习排序算法当中的 插入排序 和 …...
【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?
本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…...
MySQL数据类型与存储结构
补充知识,事务隔离的等级: READ UNCOMMITTED(读未提交) :这是最低的隔离级别,允许事务读取其他事务未提交的数据,可能导致脏读、不可重复读和幻读问题。 READ COMMITTED(读已提交࿰…...
CSRF保护--laravel进阶篇
laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...
服务器数据恢复—raid5阵列+LVM+VXFS数据恢复案例
服务器存储数据恢复环境: 某品牌MSA2000FC存储中有一组由7块盘组建的RAID5阵列,另外还有1块硬盘作为热备盘使用。 基于RAID5阵列划分的几个LUN分配给小机使用,存储空间通过LVM管理,重要数据为Oracle数据库及OA服务端。 服务器存储…...
游卡,科锐国际,蓝禾,汤臣倍健,三七互娱,顺丰,快手,途游游戏25秋招内推
游卡,科锐国际,蓝禾,汤臣倍健,三七互娱,顺丰,快手,途游游戏25秋招内推 ①科锐国际25届秋招补录 人力资源类岗位,补录城市:苏州、宁波、武汉、东莞;全日制公办…...
内存不足引发C++程序闪退崩溃问题的分析与总结
目录 1、内存不足一般出现在32位程序中 2、内存不足时会导致malloc或new申请内存失败 2.1、malloc申请内存失败,返回NULL 2.2、new申请内存失败,抛出异常 3、内存不足项目实战案例中相关细节与要点说明 3.1、内存不足导致malloc申请内存失败&#…...
C++ 多态作业练习
作业1、 编写一个英雄类 class Hero{ int atk; int def; int spd; int hp; public: 所有的get set 方法 void equipWeapon(Weapon*) 根据传入的武器不同,英雄获得不同的属性加成 } #include <iostream> #include <cstring&g…...
(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统
摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下,开发一…...
层次聚类(Hierarchical Clustering)详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Cannal实现MySQL主从同步环境搭建
大家好,我是袁庭新。 在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要,…...
Js-函数-03
函数定义 在java中我们为了提高代码的复用性,可以使用方法。同样,在JavaScript中可以使用函数来完成相同的事情。JavaScript中的函数被设计为执行特定任务的代码块,通过关键字function来定义。 <!DOCTYPE html> <html lang"en…...
9.机器学习--SVM支持向量机
支持向量机(Support Vector Machine,SVM)是一种二分类监督学习模型。支持向量机最早在 1964 年被提出,1995年前后理论成熟并开始被大量应用与人像识别、文本分类等问题中。它的基本模型是定义在特征空间上的间隔最大的线性分类器&…...
探索Python的HTTP之旅:揭秘Requests库的神秘面纱
文章目录 **探索Python的HTTP之旅:揭秘Requests库的神秘面纱**第一部分:背景介绍第二部分:Requests库是什么?第三部分:如何安装Requests库?第四部分:Requests库的五个简单函数使用方法第五部分&…...
vue3项目使用动态表单formcreate
使用两个插件: 支持可视化设计的低代码表单组件 | FormCreate 好用的低代码可视化表单设计器 | FcDesigner 一、安装 1.使用 Node.js 引入 npm install form-create/element-ui npm install form-create/designer^3 npm install element-plus 2. main.js引入…...
指针的奥秘:深入探索内存的秘密
前言 在计算机编程的广阔天地中,指针作为一种独特的数据类型,它不仅是C语言的核心,也是理解计算机内存管理的基石。指针的概念虽然强大,但对于初学者来说,它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…...
车载摄像camera基础知识和评估
一、车载摄像头应用 以下是根据图片内容重新制作的表格: | 序号 | 产品用途 |------|---------------- | 1 | AVM/环视360摄像头 | 2 | DMS摄像头 | 3 | IMS/OMS摄像头 | 4 | RVC摄像头 | 5 | 红外夜视摄像头 | 6 | 底盘透明摄像头 | 7 …...
OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解
摘要:本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数(如 mode 不同取值对应不同轮廓检索模式)及返回值的详细解析,搭配…...
微信小程序WXSS全局样式与局部样式的使用教程
微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…...
Leetcode142. 环形链表 II(HOT100)
链接 我的错误代码: class Solution { public:ListNode *detectCycle(ListNode *head) {if(!head||!head->next)return nullptr;ListNode* f head->next,*s head;while(f){f f->next,s s->next;if(!f)return nullptr;f f->next;if(fs){ListNo…...
Java程序基础⑤Java数组的定义和使用+引用的概念
目录 1. Java数组的基本概念 1.1 数组的定义 1.2 数组存在的意义 1.3 数组的使用 1.4 二维数组 2. 引用类型JVM的内存分布 2.1 JVM的内存分布 2.2 基本数据类型和引用型数据类型的区别 2.3 引用注意事项 2.4 传值传递 3. 数组总结和应用场景 3.1 一维数组和二维数组…...
丁真杯理塘大赛题解
前言:部分代码思路可能与题解思路不同,请勿强行带入 真蛰虫 原题链接 1.一道非常基础的数学题。 2.主要就是在考察分解质因数。首先看真蛰虫的质因数是不是包含了容器的所有质因数,如果没有,那么就不能放入容器中。如果全部包…...
FPGA经验谈系列文章——8、复位的设计
前言 剑法往往有着固定的招式套路,而写代码似乎也存在类似的情况。不知从何时起,众多 FPGA 工程师们在编写代码时开启了一种关于 always 语句块的流行写法,那就是: always @(posedge i_clk or negedge i_rstn) 就笔者所经历的诸多项目以及所接触到的不少工程师而言,大家在…...
Android studio与JS交互
文章目录 前言一、html二、使用步骤1.2.AS 总结 前言 最近在使用Android Studio的WebView,有些功能要AS与JS交互。 一、html html文件 <!DOCTYPE html> <html> <!--javascript--> <head><meta charset"utf-8"><title>Carson…...
健身房小程序服务渠道开展
健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…...
大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...
软考教材重点内容 信息安全工程师 第 5 章 物理与环境安全技术
5.1.1 物理安全概念 传统上的物理安全也称为实体安全,是指包括环境、设备和记录介质在内的所有支持网络信息系统运行的硬件的总体安全,是网络信息系统安全、可靠、不间断运行的基本保证,并且确保在信息进行加工处理、服务、决策支持的过程中&…...
蓝桥杯每日真题 - 第21天
题目:(空间) 题目描述(12届 C&C B组A题) 解题思路: 转换单位: 内存总大小为 256MB,换算为字节: 25610241024268,435,456字节 计算每个整数占用空间: 每个 32 位整数占用…...
【C++】C++11新特性详解:可变参数模板与emplace系列的应用
C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…...
下载并安装Visual Studio 2017过程
一、下载 1、下载链接 下载链接:官方网址 先登录 往下滑找到较早的下载 2、进行搜索下载 或者直接点击🔗网站跳转 3、确认系统信息进行下载 二、安装 下载完成后右键使用管理员身份运行 1、点击同意后安装 2、若报错—设置失败 打开控制面板-&g…...
【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制
目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…...
Java开发经验——Spring Test 常见错误
摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…...
麦肯锡报告 | 科技落地的真谛:超越技术本身的价值创造
科技创新正在以惊人的速度改变企业运作和客户体验,但实现其潜力的关键在于正确的策略、流程、文化和人才。麦肯锡强调了一个理念:Never just tech(不仅仅是技术)。这表明,成功的数字化转型不仅依赖于技术,还…...
React 常见问题解答:设置、安装、用户事件和最佳实践
在本文中,我们将回答您在开始使用 React 时可能会问的 9 个常见问题。 1、开始使用 React 需要哪些技能和知识? 在深入研究 React 之前,您应该对以下内容有深入的了解: HTML、CSS 和 JavaScript (ES6)&a…...
Mairadb 最大连接数、当前连接数 查询
目录 查询数据库 最大连接数 查询当前连接总数 环境 Mariadb 10.11.6 跳转mysql数据库: 查询数据库 最大连接数 show variables like max_connections; 注意; 这个版本不能使用 : show variables like ‘%max_connections%’; 会报错 ÿ…...
【R库包安装】R库包安装总结:conda、CRAN等
【R库包安装】R库包安装总结:conda、CRAN等 方法1:基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2:使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3:从 GitHub 安…...
php反序列化1_常见php序列化的CTF考题
声明: 以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…...
LabVIEW动态显示控件方案
在LabVIEW开发中,涉及到动态显示和控制界面的设计时,经常需要根据用户选择的不同参数来动态显示或隐藏相关控件。例如,某些能可能会根据“Type”控件的不同选择显示不同的参数,如“Target”、“Duration”和“EndType”等。在一个…...
游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
错误信息: PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"? /opt/gitlab/embedded/service…...
Ray 和 PyTorch
Ray 和 PyTorch 的介绍 Ray 是什么? Ray 是一个用于 分布式计算和机器学习任务 的开源框架,提供了一个高效的、灵活的并行计算平台。它的核心功能是支持分布式计算,帮助开发者以简单的方式扩展 Python 应用程序。 Ray 适用于以下场景&…...
Qt之详解QLockFile 文件锁
文章目录 QLockFile 详解前言什么是 QLockFile?QLockFile 的构造函数和常用成员函数构造函数1. 指定锁文件路径的构造函数 常用成员函数1. lock2. unlock3. isLocked4. setStaleLockTime5. getLockInfo6. removeStaleLock 完整示例代码总结 QLockFile 详解 前言 在…...
从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)
二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…...
机械设计学习资料
免费送大家学习资源,已整理好,仅供学习 下载网址: https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...
论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies
目录 Abtract 相关工作 核心算法: 整体流程概述 具体流程解析 1. 输入(Input) 2. 稀疏结构 VAE(Sparse Structure VAE) 3.分层体素潜在扩散(Hierarchical Voxel Latent Diffusion)…...
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 https://live.csdn.net/v/435737 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom"trigger"click"><el-inputstyle"margi…...
诠视科技受邀出席“中国虚拟现实产学研大会”
2024年11月2-3日,由中国虚拟现实技术与产业创新平台举办的第十届“中国虚拟现实产学研大会” 在北京顺利召开,大会围绕“虚拟现实技术与产业创新融合”这一主题进行深入探讨。诠视科技作为虚拟现实产业的创新领军企业,CEO林瓊受邀参加本次活动…...