Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例
Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例
- 一、Opencv大图找小图说明
- 二、Opencv的window安装
- 1.下载windows下的安装包
- 2.安装
- 3.Java中Opencv加载测试
- 三、Java中通过Opencv进行模板匹配大图找小图
- 四、进行多图查找
- 五:案例下载bilibili视频
- 1.bilibili网站安装下载视频插件
- 2.业务流程分析
- 3.代码实现
- 3.0 先截需要的几个图
- 3.1代码片段
- 3.2 程序效果截图
- 3.3 源码下载
本文将介绍Opencv在windows下的安装,并使用Java操作Opencv进行行大图找小图测试,最后通过应用大图找小图功能来实现bilibili的视频下载。
一、Opencv大图找小图说明
以下来自chatGpt3.5模型的回答:
Opencv是一款开源的计算机视觉库,可以用于图像处理、目标检测、人脸识别等领域。在Opencv中,可以使用模板匹配算法来实现大图找小图的功能。
模板匹配算法是一种基于像素级别的匹配算法,它的基本思想是在大图中寻找与小图相似的区域。具体实现过程如下:
读取大图和小图,并将它们转换为灰度图像。
定义一个滑动窗口,在大图中滑动,并将窗口中的像素与小图进行比较。
计算窗口中像素与小图像素的差异,得到一个匹配度。
将匹配度保存到一个矩阵中,矩阵的大小与大图相同。
在矩阵中找到最大匹配度的位置,即为小图在大图中的位置。
Opencv提供了多种模板匹配算法,包括平方差匹配、归一化平方差匹配、相关匹配和归一化相关匹配等。不同的算法适用于不同的场景,需要根据实际情况选择合适的算法。
总之,Opencv提供了强大的图像处理功能,可以实现大图找小图等多种应用。
二、Opencv的window安装
1.下载windows下的安装包
官网的路径是:https://opencv.org/
我下载的是4.2.0,下载地址(官网)为:https://udomain.dl.sourceforge.net/project/opencvlibrary/4.2.0/opencv-4.2.0-vc14_vc15.exe
或者链接(非官网,速度快些):https://nchc.dl.sourceforge.net/project/opencvlibrary/4.2.0/opencv-4.2.0-vc14_vc15.exe
2.安装
双击opencv-4.2.0-vc14_vc15.exe安装即可,我这里安装到D:\ProgramFiles\opencv
安装后的目录如:
3.Java中Opencv加载测试
引入opencv-420.jar包:
新建一个Java的maven工程,然后将安装目录下的build\java\opencv-420.jar
复制到工程的lib目录
pom.xml中采用本地引入方式如下:
<!-- opencv start --><dependency><groupId>cn.gzsendi</groupId><artifactId>opencv-420</artifactId><version>0.0.1</version><scope>system</scope><systemPath>${pom.basedir}/lib/opencv-420.jar</systemPath></dependency><!-- opencv end -->
将
build\java\x64\opencv_java420.dll
放在java工程的resoure目录下
代码测试加载Opencv是否正常
package cn.lihua;
import java.net.URL;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;public class OpencvTest {public static void main(String[] args) throws InterruptedException {// 加载动态库,放在资源目录下,推荐URL url = ClassLoader.getSystemResource("opencv_java420.dll");//另一种加载的方式,放在环境变量中,需要配置//System.loadLibrary(Core.NATIVE_LIBRARY_NAME);System.load(url.getPath());Mat source = Imgcodecs.imread("images/source.jpg");HighGui.imshow("测试", source);HighGui.waitKey();}
}
执行代码后,如果能打开图像,则opencv环境正常。
三、Java中通过Opencv进行模板匹配大图找小图
Java中进行大图找小图主要如下步骤:
1.导入Opencv库
2.加载图像
3.进行模板匹配
4.获取匹配结果
5.绘制匹配结果
6.显示结果
对应的代码如下:
package cn.lihua.modules.test;import java.net.URL;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;public class TemplateMatchingTest {public static void main(String[] args) {String sourceImg = "images/source.bmp";String smallImg = "images/smallImg.bmp";new TemplateMatchingTest().templateMatching(sourceImg, smallImg);}public void templateMatching(String sourceImg,String smallImg) {// 1.导入Opencv库URL url = ClassLoader.getSystemResource("opencv_java420.dll");System.load(url.getPath());// 2.加载图像Mat src = Imgcodecs.imread(sourceImg);// 待匹配图片Mat template = Imgcodecs.imread(smallImg);// 获取匹配模板// 3.进行模板匹配// 创建一个输出图像Mat outputImage = new Mat(src.rows(), src.cols(), src.type());Imgproc.matchTemplate(src, template, outputImage, Imgproc.TM_CCOEFF_NORMED);// 4.获取匹配结果,查找最大匹配值Core.MinMaxLocResult result = Core.minMaxLoc(outputImage);Point matchLoc = result.maxLoc;double similarity = result.maxVal; //匹配度int x = (int) matchLoc.x; //小图大大图中的x坐标int y = (int) matchLoc.y; //小图大大图中的y坐标System.out.println(x + "," + y + " similarity: " + similarity);//将查找到的结果标上框框Imgproc.rectangle(src,new Point(x,y),new Point(x+template.cols(),y+template.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);//5.显示结果HighGui.imshow("模板匹配", src);HighGui.waitKey();}}
source.bmp
smallImg.bmp
模板匹配后:
四、进行多图查找
三步骤中的查询是将匹配上的最佳的子图返回,有时可能子图中会有多个,也希望能把所有的都返回,可以在查询到第一个后,不断的递归裁剪并继续匹配,最终返回所有的,
示例代码如下
:
package cn.lihua.modules.test;import java.net.URL;import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;/*** 返回多个位置的例子* @author liujh**/
public class TemplateMatchingMultiResultExample {public static void main(String[] args) {String sourceImg = "images/big1.bmp";String smallImg = "images/small1.bmp";new TemplateMatchingMultiResultExample().templateMultiMatching(sourceImg, smallImg);}public void templateMultiMatching(String sourceImg,String smallImg) {// 1.导入Opencv库URL url = ClassLoader.getSystemResource("opencv_java420.dll");System.load(url.getPath());// 2.加载图像Mat largeImage = Imgcodecs.imread(sourceImg);//待匹配图片Mat smallImage = Imgcodecs.imread(smallImg);// 获取匹配模板1// 创建输出图像Mat outputImage = new Mat(largeImage.rows(), largeImage.cols(), largeImage.type());// 进行模板匹配Imgproc.matchTemplate(largeImage, smallImage, outputImage, Imgproc.TM_CCOEFF_NORMED);// 设置匹配阈值double threshold = 0.8;// 循环遍历所有匹配结果while (true) {// 查找最大匹配值Core.MinMaxLocResult result = Core.minMaxLoc(outputImage);Point matchLoc = result.maxLoc;double maxVal = result.maxVal;// 如果匹配值小于阈值,则退出循环if (maxVal < threshold) {break;}System.out.println(matchLoc.x + "," + matchLoc.y + " similarity: " + maxVal);// 在大图中标出匹配位置Imgproc.rectangle(largeImage, matchLoc, new Point(matchLoc.x + smallImage.cols(),matchLoc.y + smallImage.rows()), new Scalar(0, 0, 255), 2);// 将匹配位置的值设置为0,以便下一次匹配Imgproc.rectangle(outputImage, matchLoc, new Point(matchLoc.x + smallImage.cols(),matchLoc.y + smallImage.rows()), new Scalar(0, 0, 0), -1);}HighGui.imshow("模板匹配", largeImage);HighGui.waitKey();}
}
big.bmp
small.bmp
匹配结果:
五:案例下载bilibili视频
经过上面的测试后,我们具备了通过大图找小图的能力,接下来我们通过实践一下,写程序将bilibili网站的视频下载下来。
思路:
1.bilibili网站默认没有下载视频的插件,首先安装下载插件
2.手上尝试下载视频,找出下载视载可以自动化操作的步骤
3.通过大图找小图功能,并结合Java的Robot类实现自动化找到下载视频需要的对应图标和位置,然后模拟点击,达到自动下载的效果。
1.bilibili网站安装下载视频插件
上https://bilibilihelper.com/网站进行插件下载
得到bilibili-helper-u-2.5.23.8.zip离线插件包
chrome浏览器地址栏输入
chrome://extensions/
,开发模式勾上,拖动bilibili-helper-u-2.5.23.8.zip至浏览器进行安装
安装成功后,点一个视频看(一定需要点击播放视频)右上角会出现下载插件的小图标
2.业务流程分析
下载一个视频的步骤如下,可以看出来步骤是这样:
点击要下载的视频链接,点右上角的插件图标,在弹出的窗口中点击1080P高清图标,再点一下图标会出现点击下载,再点一下点击下载即可
所有视频链接的下载规律是:
前面P1、P2、P3、P4视频要点击的位置需要定位,第5个视频开始后面的视频要点击的位置都是和第5个视频一样
,通过这个规律,我们可以将P1-P4视频的点击位置,通过大图找小图功能来定位,P5和后面的视频就直接用绝对位置定位进行点击,(其实都可以用绝对定位,但主要想演示就用一下Opencv的大图找小图功能)
这样经过分析后,整个视频下载的业务逻辑如下
1.将P1-P4的视频的链接截好小图,右上角插件图示、1080高清、点击下载等图标截好小图,供后面程序进行匹配使用
2.P1-P4的视频下载,通过大图找小图进行定位,通过Java的Robot类进行模拟点击实现视频下载
3.P5及以后的视频,通过直接绝对定位到屏幕位置点击进行视屏下载
4.视频最后的几个也简单通过绝对定位下载,和P5视频的位置不相同,也需要处理一下,我们通过绝对定位处理(此案例主要是为了练习opencv大图找小图,所有的下载其实都能通过绝对定位位置下载
)
下图为最后几集的点击,可以看到不再是和P5视屏一样的位置,需要每次向下移动一行的距离
3.代码实现
3.0 先截需要的几个图
注:程序启动前最好在你的电脑上重新截图
3.1代码片段
定义OpencvService接口用来实现大图找小图
package cn.lihua.modules.bilibili.service;import java.util.List;import cn.lihua.modules.bilibili.model.FindImgDto;public interface OpencvService {/*** 大图找小图* @param bigImg* @param smallImg* @return*/FindImgDto templateMatching(String bigImg,String smallImg);/*** 大图找小图* @param bigImg* @param smallImg* @param thresholdValue 匹配度* @return*/FindImgDto templateMatching(String bigImg,String smallImg,Double thresholdValue);/*** 大图找小图,返回多个* @param bigImg* @param smallImg* @param thresholdValue 匹配度* @return*/List<FindImgDto> templateMultiMatching(String bigImg,String smallImg,Double thresholdValue);List<FindImgDto> templateMultiMatching(String bigImg,String smallImg);}
定义BilibiliVideoDownService进行视频的下载
/*** 下载Bilibili视频* @author jxlhl*/
public interface BilibiliVideoDownService {public void exportStart() throws Exception;}
Robot类用于模拟移动和点击鼠标
try {robot = new Robot();//核心机器人类,键盘或鼠标事件的重放执行。} catch (AWTException e) {logger.error("error",e);}
全屏截图,用于每次大图找小图时使用
/*** 全屏截图*/private void createScreenCapture() {int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();try {BufferedImage screenShotImage = robot.createScreenCapture(new Rectangle(0, 0, width, height));File sourceImg = new File("images/fullScreen.jpg");ImageIO.write(screenShotImage, "jpg", sourceImg);} catch (Exception e) {logger.error("error",e);}}
鼠标移动与点击的代码
/** 移到指定的位置并左键点击* */private void mouseMoveAndClick(int clientX, int clientY) throws InterruptedException{mouseMove(clientX, clientY);robot.delay(1000);//随即休眠0-2秒mouseClick();}/*** 点击鼠标左键* @throws InterruptedException */private void mouseClick() throws InterruptedException{robot.mousePress(InputEvent.BUTTON1_MASK);//左键robot.delay(100);robot.mouseRelease(InputEvent.BUTTON1_MASK);//左键}/*** 移动鼠标到指定的坐标*/private void mouseMove(int clientX, int clientY){//不太明白这里为什么这样写,但这一行代码结合缩放比例可以稍微解决定位不准确的问题。robot.mouseMove(-1, -1);//我的电脑是200%,因此除以2String screenPercent = "200";double rate = Integer.parseInt(screenPercent)/100d;//增加一点点的随机数,防检测robot.mouseMove((int)(clientX/rate) , (int)(clientY/rate));}
下载某一个视频的逻辑代码
/*** 下载第{pageNumber}个视频* @param pageNumber* @param totalCount* @throws Exception*/private void downLoad(int pageNumber,int totalCount) throws Exception{Thread.sleep(3000l);logger.info("开始下载第{}个视频,剩余{}个",pageNumber,(totalCount-pageNumber));//截图全屏,然后写入images/fullScreen.jpgcreateScreenCapture();//进行大图找小图测试FindImgDto findImgDto = null;//前面的4个视频,通过大图找小图定位位置if(pageNumber<=4){findImgDto = opencvService.templateMatching(fullScreen,"images/template/P"+pageNumber+".bmp");logger.info(JsonUtil.toJSONString(findImgDto));//找到的坐标点击时,x坐标向右靠100,可以点击得更中心些mouseMoveAndClick(findImgDto.getClientX() + 100 , findImgDto.getClientY());}else{if(pageNumber <= 195){//第5-第195个视频都点击和第5个视频所在的位置即可,1768,1011(你需要换成你的电脑上对应的位置)mouseMoveAndClick(1768,1011);}else{//最后5个视频特殊处理,直接定位进行点击//第196个视频if(pageNumber == 196){mouseMoveAndClick(1768,1080);//(你需要换成你的电脑上对应的位置)}//第197个视频if(pageNumber == 197){mouseMoveAndClick(1768,1150);//(你需要换成你的电脑上对应的位置)}if(pageNumber == 198){mouseMoveAndClick(1768,1220);//(你需要换成你的电脑上对应的位置)}if(pageNumber == 199){mouseMoveAndClick(1768,1280);//(你需要换成你的电脑上对应的位置)}if(pageNumber == 200){mouseMoveAndClick(1768,1340);//(你需要换成你的电脑上对应的位置)}}}//不断等待查找右上角的下载插件图标findImgDto = new FindImgDto();while(!findImgDto.isIfFind()){Thread.sleep(3000l);createScreenCapture();findImgDto = opencvService.templateMatching(fullScreen,click1);mouseMoveAndClick(findImgDto.getClientX() , findImgDto.getClientY());}//不断等待查找1080高清图标findImgDto = new FindImgDto();while(!findImgDto.isIfFind()){Thread.sleep(3000l);createScreenCapture();findImgDto = opencvService.templateMatching(fullScreen,click2);mouseMoveAndClick(findImgDto.getClientX() , findImgDto.getClientY());robot.delay(100);mouseMove(findImgDto.getClientX()+300, findImgDto.getClientY());}//不断等待查找点击下载图标findImgDto = new FindImgDto();while(!findImgDto.isIfFind()){Thread.sleep(3000l);createScreenCapture();findImgDto = opencvService.templateMatching(fullScreen,click3);mouseMoveAndClick(findImgDto.getClientX() , findImgDto.getClientY());robot.delay(100);mouseMove(findImgDto.getClientX()+300, findImgDto.getClientY());}//点击下载图标后,需要再点一下右上角的插件图标复原findImgDto = new FindImgDto();while(!findImgDto.isIfFind()){Thread.sleep(3000l);createScreenCapture();findImgDto = opencvService.templateMatching(fullScreen,click1);mouseMoveAndClick(findImgDto.getClientX() , findImgDto.getClientY());robot.delay(100);}}
下载所有视频的逻辑代码
public void exportStart() throws Exception {//0.下载Bilibili视频自动化操作logger.info("BilibiliVideoDownService Start....");//休息5秒等待程序启动了切换到下载网站页面Thread.sleep(5000l);//需要下载的视频数量int totalCount = 200;try {//遍历下载每一个视频for(int i =1 ;i<=totalCount;i++){downLoad(i,totalCount);}//阻塞判断是否下载完成ifFinishedDownload();logger.info("all completed."); } catch (Exception e) {logger.error("errror",e);} finally {}logger.info("BilibiliVideoDownService success..");}
3.2 程序效果截图
3.3 源码下载
github: https://github.com/jxlhljh/opencvBilibiliDownloadTest.git
gitee: https://gitee.com/jxlhljh/opencvBilibiliDownloadTest.git
相关文章:

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例
Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五:案例下载bilibili视…...

肠道健康从核心菌属开始:肠道菌群的关键
谷禾健康 5月29日,是世界肠道健康日。肠道是人体最重要的消化系统之一,与人体健康紧密相关。而肠道菌群作为肠道重要组成部分,在肠道健康中发挥着重要的作用。 编辑 由于基因、环境、饮食、药物等因素的影响,每个人的肠道菌群都…...
深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用
大家好,我是微学AI,今天给大家介绍一下深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用,NASNet是由Google Brain团队开发的一种具有自动搜索能力的神经网络模型,利用强化学习和进化算法等技术来自动地搜索最优的神经网络架构。NASNet模型的设计灵感…...

碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析
文章目录 效果一览文章概述研究内容环境准备源码设计KNNRandom ForestDecision TreeMLPModel Evaluation学习总结参考资料效果一览...
人体检测技术之毫米波雷达
人体检测技术之毫米波雷达 1.概述 智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。 选型主要是几个维度: 1.支持检测的距离范围,能否准确输出距离信息 2.支持…...
“Chain of Thought Reasoning“ 和 “Chain Prompts“ 是什么
"Chain of Thought Reasoning" 和 "Chain Prompts" 是什么 1. "Chain Prompts" 是什么2. “Chain of Thought Reasoning” 是什么 1. “Chain Prompts” 是什么 “Chain Prompts” 是指一系列相关的提示,它们之间有逻辑上的联系和依赖关系。用户…...
signal
读信号,dqs 是对齐到dq的边沿, 写信号,dqs 的边沿是对到中间的。 spec 就是这样规定的。我们在dq的最中间的采样,肯定是最安全的。 dqs 是对齐到dq的边沿 , 在silicon 内部,还是通过移位完成的。 rl: re…...

深度研究微软的资产负债表和财务状况以及未来投资价值
来源:猛兽财经 作者:猛兽财经 微软股票的关键指标 猛兽财经认为,微软公布的2023财年第三季度财务业绩,有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%,从2022财年第…...

Mac电脑删除第三方软件工具CleanMyMac X
经常使用Mac的人都知道,Mac除了可以在AppStore下载应用程序,还有许多软件是需要在网页上搜索下载的第三方软件。那么这类第三方软件软件除了下载方式不同之外还有什么是和从App store下载的软件有区别的吗?答案是肯定的,那就是这些…...

leetcode174. 地下城游戏(java)
地下城游戏 leetcode174. 地下城游戏题目描述 动态规划解题思路代码 动态规划专题 leetcode174. 地下城游戏 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/dungeon-game 题目描述 恶魔们抓住了公主并将她关在了地下城 …...
信号与系统复习笔记——傅里叶变换
信号与系统复习笔记——傅里叶变换 周期信号的傅里叶级数表示 特征函数 假设LTI系统的输入为 x ( t ) e s t x(t) e^{st} x(t)est 输出为: y ( t ) e s t ∗ h ( t ) ∫ − ∞ ∞ e s ( t − τ ) h ( τ ) d τ e s t ∫ − ∞ ∞ e − s τ h ( τ ) d…...

Allegor17.2版本WIN11系统CIS配置提示错误解决方案
错误提示: ERROR(ORCIS-6250): Unable to continue. Database access failed. Contact the database administrator to correct the following error(s), and then retry. ODBC Error Code: -1 Description: 在指定的 DSN 中,驱动程序和应用程序之间的体…...
Java设计模式七大原则-合成聚合复用原则
🧑💻作者:猫十二懿 ❤️🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 合成-聚合复用原则 1、合成-聚合复用原则介绍 合成/聚合复用原则(Composition/Aggregatio…...

SOFA Weekly|可信基础设施技术分论坛、Layotto 社区会议回顾与预告、社区本周贡献...
SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…...

Melody 监控(四十九)
当新的世界出现,请立即向他奔去 上一章简单介绍了Spring Boot Actuator详解(四十八), 如果没有看过,请观看上一章 一. JavaMelody 一.一 什么是 Java Melody JavaMelody是一个方便的Java或JavaEE Web 应用程序监控工具。 它允许自动存储由 Web 应用程序的实际操…...
Shell脚本管道符常用搭配命令
1.sort sort命令——以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort [选项] 文件名 cat file | sort [选项] 常用选项 选项作用-n按照数字进行…...

基于html+mysql+Spring+mybatis+Springboot的Springboot宠物医院管理系统
运行环境: 最好是java jdk 1.8,我在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以,如果编译器的版本太低,需要升级下编译器,不要弄太低的版本 tomcat服务器环…...
算法模板(3):搜索(5):其他
搜索 模拟退火 模拟退火一个很关键的是,看看枚举到每一个方案是不是可能的。 3167. 星星还是树 在二维平面上有 n 个点,第 i 个点的坐标为 ( x i , y i ) (x_i,y_i) (xi,yi)。请你找出一个点,使得该点到这 n 个点的距离之和最小。这…...

AWS CodeWhisperer 心得体会:安装与使用
大家好,今天我要和大家分享一下我在使用 AWS CodeWhisperer 这个工具时的心得体会。首先,让我们了解一下什么是 AWS CodeWhisperer。 什么是 AWS CodeWhisperer? AWS CodeWhisperer 是一个用于帮助开发者在 AWS 云平台上更轻松地编写、测试…...
高级查询 — 子查询
关于嵌套查询(子查询) 1.概述 子查询是在一个查询中嵌套另一个查询的查询语句。内部查询从外部查询或数据库中提取数据,然后使用这些数据来执行内部查询。出现在其他语句中的 select 语句,称为嵌套查询或子查询。外部的查询语句…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...