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

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进行模板匹配大图找小图四、进行多图查找五&#xff1a;案例下载bilibili视…...

肠道健康从核心菌属开始:肠道菌群的关键

谷禾健康 5月29日&#xff0c;是世界肠道健康日。肠道是人体最重要的消化系统之一&#xff0c;与人体健康紧密相关。而肠道菌群作为肠道重要组成部分&#xff0c;在肠道健康中发挥着重要的作用。 编辑​ 由于基因、环境、饮食、药物等因素的影响&#xff0c;每个人的肠道菌群都…...

深度学习实战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

读信号&#xff0c;dqs 是对齐到dq的边沿&#xff0c; 写信号&#xff0c;dqs 的边沿是对到中间的。 spec 就是这样规定的。我们在dq的最中间的采样&#xff0c;肯定是最安全的。 dqs 是对齐到dq的边沿 &#xff0c; 在silicon 内部&#xff0c;还是通过移位完成的。 rl: re…...

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…...

Mac电脑删除第三方软件工具CleanMyMac X

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

leetcode174. 地下城游戏(java)

地下城游戏 leetcode174. 地下城游戏题目描述 动态规划解题思路代码 动态规划专题 leetcode174. 地下城游戏 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/dungeon-game 题目描述 恶魔们抓住了公主并将她关在了地下城 …...

信号与系统复习笔记——傅里叶变换

信号与系统复习笔记——傅里叶变换 周期信号的傅里叶级数表示 特征函数 假设LTI系统的输入为 x ( t ) e s t x(t) e^{st} x(t)est 输出为&#xff1a; y ( t ) e s t ∗ h ( t ) ∫ − ∞ ∞ e s ( t − τ ) h ( τ ) d τ e s t ∫ − ∞ ∞ e − s τ h ( τ ) d…...

Allegor17.2版本WIN11系统CIS配置提示错误解决方案

错误提示&#xff1a; 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 中&#xff0c;驱动程序和应用程序之间的体…...

Java设计模式七大原则-合成聚合复用原则

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 合成-聚合复用原则 1、合成-聚合复用原则介绍 合成/聚合复用原则&#xff08;Composition/Aggregatio…...

SOFA Weekly|可信基础设施技术分论坛、Layotto 社区会议回顾与预告、社区本周贡献...

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…...

Melody 监控(四十九)

当新的世界出现&#xff0c;请立即向他奔去 上一章简单介绍了Spring Boot Actuator详解(四十八), 如果没有看过,请观看上一章 一. JavaMelody 一.一 什么是 Java Melody JavaMelody是一个方便的Java或JavaEE Web 应用程序监控工具。 它允许自动存储由 Web 应用程序的实际操…...

Shell脚本管道符常用搭配命令

1.sort sort命令——以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 sort [选项] 文件名 cat file | sort [选项] 常用选项 选项作用-n按照数字进行…...

基于html+mysql+Spring+mybatis+Springboot的Springboot宠物医院管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…...

算法模板(3):搜索(5):其他

搜索 模拟退火 模拟退火一个很关键的是&#xff0c;看看枚举到每一个方案是不是可能的。 3167. 星星还是树 在二维平面上有 n 个点&#xff0c;第 i 个点的坐标为 ( x i , y i ) (x_i,y_i) (xi​,yi​)。请你找出一个点&#xff0c;使得该点到这 n 个点的距离之和最小。这…...

AWS CodeWhisperer 心得体会:安装与使用

大家好&#xff0c;今天我要和大家分享一下我在使用 AWS CodeWhisperer 这个工具时的心得体会。首先&#xff0c;让我们了解一下什么是 AWS CodeWhisperer。 什么是 AWS CodeWhisperer&#xff1f; AWS CodeWhisperer 是一个用于帮助开发者在 AWS 云平台上更轻松地编写、测试…...

高级查询 — 子查询

关于嵌套查询&#xff08;子查询&#xff09; 1.概述 子查询是在一个查询中嵌套另一个查询的查询语句。内部查询从外部查询或数据库中提取数据&#xff0c;然后使用这些数据来执行内部查询。出现在其他语句中的 select 语句&#xff0c;称为嵌套查询或子查询。外部的查询语句…...

Axure RP中文语言包技术深度解析:从键值对到国际化架构的工程实践

Axure RP中文语言包技术深度解析&#xff1a;从键值对到国际化架构的工程实践 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 在…...

5个关键步骤掌握PyAEDT:从安装到高级仿真实战指南

5个关键步骤掌握PyAEDT&#xff1a;从安装到高级仿真实战指南 【免费下载链接】pyaedt AEDT Python Client Package 项目地址: https://gitcode.com/gh_mirrors/py/pyaedt PyAEDT作为Ansys Electronics Desktop的Python客户端库&#xff0c;为工程师提供了强大的电子设计…...

2026届学术党必备的五大AI科研神器实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 降 AI 指令&#xff0c;是一种合规优化工具&#xff0c;用于调试 AI 生成逻辑&#xff0c;以…...

羽毛球每天必练的基本功:拉吊四方球战术、吊杀结合战术

文章目录 引言 I 羽毛球每天必练的基本功 1. 握拍练习 2. 挥拍动作 3. 步法训练 4. 球感练习 5. 发力技巧 II 发力 正确发力 握拍 反手发力 III 羽毛球单打战术 拉吊四方球战术 直线变斜线战术 重复落点战术 吊杀结合战术 追身球压制战术 防守反击战术 引言 打球前必须热身(活…...

learn claude code S12 Worktree 任务隔离详解笔记

S12 Worktree 任务隔离详解笔记基于 s12_worktree_task_isolation.py 源码逐行分析&#xff0c;配合 s12-worktree-task-isolation.md 设计思路。一、问题&#xff1a;多个任务共享一个工作目录&#xff0c;互相踩踏 前面 11 章的 agent 都在同一个工作目录下操作。当只有一个 …...

别让直觉带路:Infoseek视角下的噪音过滤与火情预警实战

在舆情的世界里&#xff0c;最可怕的不是对手太强大&#xff0c;而是自己吓自己。很多时候&#xff0c;企业之所以“翻车”&#xff0c;并非因为危机本身不可控&#xff0c;而是因为公关团队在面对网友吐槽时过度敏感&#xff0c;发布了不必要的声明或做出了过激反应&#xff0…...

WarcraftHelper完整指南:5分钟让魔兽争霸3在现代电脑上完美运行

WarcraftHelper完整指南&#xff1a;5分钟让魔兽争霸3在现代电脑上完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代Win…...

从零构建实时数据仪表盘:React+Node.js实现任务控制面板

1. 项目概述&#xff1a;从“任务控制面板”看现代数据驱动决策的落地最近在GitHub上看到一个挺有意思的项目&#xff0c;叫iriseye931-ai/mission-control-dashboard。光看这个名字&#xff0c;就让我想起了科幻电影里那些布满屏幕、闪烁着各种数据和图表的指挥中心。没错&…...

死锁四大必要条件解析

好的&#xff0c;针对“死锁考点与高频面试题”&#xff0c;我将直接进行核心内容解构与推演&#xff0c;并生成符合规范的答案。死锁是多线程并发编程中的核心难点与高频考点&#xff0c;其核心围绕定义、条件、场景、检测、预防与避免展开。一、 死锁核心定义与必要条件死锁是…...

初创公司如何构建高效董事会:从法律合规到战略增长引擎

1. 创业公司的董事会&#xff1a;从法律义务到增长引擎对于很多初次创业的创始人来说&#xff0c;“董事会”这个词听起来可能既遥远又麻烦。它像是公司法条里一个冷冰冰的规定&#xff0c;或者是在融资时不得不向投资人妥协、让渡控制权的象征。尤其是在公司刚起步、团队只有三…...