Opencv-C++笔记 (17) : 模板匹配
文章目录
- 1--概念
- 2-- 方法
- 3 结果
- 3.1 ROI区域的获取使用
- 自适应目标匹配
1–概念
opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下:
void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::InputArray templ, // 用于匹配的模板,和image类型相同, 大小 w-hcv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)-(H-h+1)int method // 用于比较的方法 );
2-- 方法
3 结果
模板匹配函数cv::MatchTemplate一次计算模板与待测图像的相似度,并将结果存入映 图像result中,也就是result图像中的每一个点的值代表一次相似度比较结果;其中,模
通过在待检测的图像上从左到右,从上到下滑动,每到达一个像素点,就会以这个像素点
左上角顶点从原图像中截取一个与模板大小一样的图像进行像素比较的运算,模板在滑动
过程中,将模板和当前截取的图像的比较计算结果储存在result矩阵中,result的大小为(W
w+1,H-h+1),在result中的每个位置(x,y)的值都表示以这个点为左上角顶点截取的图像
模板像素计算后的计算结果;模板在待测图像上每次在横向或者纵向上每次移动一个像素点
然后进行一次比较,所以横向比较W-w+1次,纵向比较H-h+1次,最终得到一个(W w+1)x(H-h+1)的result矩阵;
3.1 ROI区域的获取使用
cv::MinMaxLoc(result,&min_val,&max_val,&min_loco,&max_loc,NULL);从result中提取最大值(相似度最高)以及最大值的位置(即在result中该最大值max_val的坐标位置max_loc,即模板滑行时左上角的坐标,类似于图中的坐标(x,y);
由此得到rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height);其中rect表示最佳的匹配的矩形区域;minVal参数表示返回的最小值,如果不需要,则使用NULL。maxVal参数表示返回的最大值,如果不需要,则使用NULL。minLoc参数表示返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。maxLoc参数表示返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。
3.2、 代码实现
单目标匹配
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>using namespace std;
using namespace cv;int main()
{Mat img, templ, result; //img为待测图 templ是目标图片 result是结构图img = imread("../1.jpg");templ = imread("../2.jpg");//1.构建结果图像resultImg(注意大小和类型)//如果原图(待搜索图像)尺寸为W x H, 而模版尺寸为 w x h, 则结果图像尺寸一定是(W-w+1)x(H-h+1)//结果图像必须为单通道32位浮点型图像int result_cols = img.cols - templ.cols + 1; //result的尺寸大小int result_rows = img.rows - templ.rows + 1;result.create(result_cols, result_rows, CV_32FC1);//2.模版匹配//这里我们使用的匹配算法是标准平方差匹配 method=CV_TM_SQDIFF_NORMED,数值越小匹配度越好matchTemplate(img, templ, result, CV_TM_SQDIFF_NORMED);//3.正则化(归一化到0-1)normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//4.找出resultImg中的最大值及其位置double minVal = -1;double maxVal;Point minLoc;Point maxLoc;Point matchLoc;cout << "匹配度:" << minVal << endl;// 定位极值的函数minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());cout << "匹配度:" << minVal << endl;cout << "minPosition: " << minLoc << endl;cout << "maxPosition: " << maxLoc << endl;matchLoc = minLoc; //5.根据resultImg中的最大值位置在源图上画出矩形和中心点Point center = Point(minLoc.x + templ.cols / 2, minLoc.y + templ.rows / 2);rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);circle(img, center, 2, Scalar(255, 0, 0), 2);imshow("img", img);imshow("template", templ);waitKey(0);return 0;
}
实时单目标识别
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;int main()
{//1.定义VideoCapture类对象video,打开摄像头VideoCapture video(0);//1.1.判断是否打开if (!video.isOpened()){cout << "video open error!" << endl;return 0;}//2.循环读取视频的每一帧,对每一帧进行模版匹配while (1){//2.1.读取帧Mat frame;video >> frame;//2.2.对帧进行异常检测if (frame.empty()){cout << "frame empty" << endl;break;}//2.3.对帧进行模版匹配Mat tempImg = imread("../1.jpg", CV_LOAD_IMAGE_COLOR);cout << "Size of template: " << tempImg.size() << endl;//2.3.1.构建结果图像resultImg(注意大小和类型)//如果原图(待搜索图像)尺寸为W x H, 而模版尺寸为 w x h, 则结果图像尺寸一定是(W-w+1)x(H-h+1)//结果图像必须为单通道32位浮点型图像int width = frame.cols - tempImg.cols + 1;int height = frame.rows - tempImg.rows + 1;Mat resultImg(Size(width, height), CV_32FC1);//2.3.2.模版匹配matchTemplate(frame, tempImg, resultImg, CV_TM_CCOEFF_NORMED);imshow("result", resultImg);//2.3.3.正则化(归一化到0-1)normalize(resultImg, resultImg, 0, 1, NORM_MINMAX, -1);//2.3.4.找出resultImg中的最大值及其位置double minValue = 0;double maxValue = 0;Point minPosition;Point maxPosition;minMaxLoc(resultImg, &minValue, &maxValue, &minPosition, &maxPosition);cout << "minValue: " << minValue << endl;cout << "maxValue: " << maxValue << endl;cout << "minPosition: " << minPosition << endl;cout << "maxPosition: " << maxPosition << endl;//2.3.5.根据resultImg中的最大值位置在源图上画出矩形rectangle(frame, maxPosition, Point(maxPosition.x + tempImg.cols, maxPosition.y + tempImg.rows), Scalar(0, 255, 0), 1, 8);imshow("srcImg", frame);imshow("template", tempImg);if (waitKey(10) == 27){cout << "ESC退出" << endl;break;};}return 0;
}
多目标模板匹配
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>using namespace std;
using namespace cv;Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH);int main()
{Mat src = imread("../1.jpg");Mat srcCopy = src.clone();Mat temp = imread("../2.jpg");Mat result;if (src.empty() || temp.empty()){cout << "打开图片失败" << endl;return 0;}vector<Mat> templat;vector<float> minV;vector<Point> minL;int srcW, srcH, templatW, templatH, resultH, resultW;srcW = src.cols;srcH = src.rows;templat.push_back(temp);double minValue, maxValue;Point minLoc, maxLoc;for (int i=0;i<10;i++){cout << i << ": ";templatW = templat[i].cols;templatH = templat[i].rows;if (srcW < templatW || srcH < templatH){cout << "模板不能比原图大" << endl;return 0;}resultW = srcW - templatW + 1;resultH = srcH - templatH + 1;result.create(Size(resultW, resultH), CV_32FC1);matchTemplate(src, templat[i], result, CV_TM_SQDIFF_NORMED);minMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);cout << "min1: " << minValue << endl;if (minValue<=0.070055){rectangle(srcCopy, minLoc, Point(minLoc.x + templatW, minLoc.y + templatH), Scalar(0, 0, 255), 2, 8, 0);Point new_minLoc;new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);float *data = result.ptr<float>(new_minLoc.y);cout << "min2: " << data[new_minLoc.x] << " ";if (data[new_minLoc.x]<=0.5){cout << "进这个函数了:" << i << ":" << new_minLoc.x;cout << " " << new_minLoc.y;rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),Scalar(0, 255, 0), 2, 8, 0);new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);}float *data1 = result.ptr<float>(new_minLoc.y);cout << "min3: " << data1[new_minLoc.x] << " " << endl;if (data1[new_minLoc.x] <= 0.4){rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),Scalar(255, 0, 0), 2, 8, 0);}}cout << "#" << endl;Mat temp_templat;resize(templat[i], temp_templat, Size(templat[i].cols / 1.1, templat[i].rows / 1.1));templat.push_back(temp_templat);}imshow("结果", srcCopy);waitKey(0);return 0;
}Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH)
{//imshow("result", result);//cout << "maxvalue: " << maxValue << endl;int startX = minLoc.x - templatW / 3;int startY = minLoc.y - templatH / 3;int endX = minLoc.x + templatW / 3;int endY = minLoc.y + templatH / 3;if (startX < 0 || startY < 0){startX = 0;startY = 0;}if (endX > result.cols - 1 || endY > result.rows - 1){endX = result.cols - 1;endY = result.rows - 1;}int y, x;for (y = startY; y < endY; y++){for (x = startX; x < endX; x++){float *data = result.ptr<float>(y);data[x] = maxValue;}}double new_minValue, new_maxValue;Point new_minLoc, new_maxLoc;minMaxLoc(result, &new_minValue, &new_maxValue, &new_minLoc, &new_maxLoc);//imshow("result_end", result);return new_minLoc;
}
通过得到的结果我们发现我们的模板匹配好像匹配区域与模板的尺寸是一致的,由此很容易产生误差,或是得到并不理想的区域,而在实际生活中,由于待测图像与摄像头之间的距离的变换,模板的大小因素的影响,若是想要得到较好的匹配结果,则需要我们实现自适应尺寸的模板匹配;
由此,我们开始进行自适应尺寸的模板匹配,载入的模板图像,另其进入循环,每次循环缩放一定的比例,在进行模板匹配,最终我们得到了不同比例下的ROI区域,对所有的ROI区域与我们的模板图片进行相似度的比较,选出相似度最高的匹配图像,同时获得最佳的匹配比例;
自适应目标匹配
代码流程:
1,载入待测图像与模板;2,将模板图像等比例放大或缩小3,没改变一次进行一次模板匹配4,得到匹配区域的图片5,将得到的ROI图片与原始模板进行相似性比较6,筛选出相似性最好的ROI区域7,在待测图片上进行框选8,输出图片
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>using namespace std;
using namespace cv;int pHash(Mat matSrc1, Mat matSrc2)
//int main()
{Mat matDst1, matDst2;// Mat matSrc1 = imread("../1.jpg");
// Mat matSrc2 = imread("../3.jpg");cv::resize(matSrc1, matDst1, cv::Size(32, 32), 0, 0, cv::INTER_CUBIC);cv::resize(matSrc2, matDst2, cv::Size(32, 32), 0, 0, cv::INTER_CUBIC);cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);matDst1.convertTo(matDst1, CV_32F);matDst2.convertTo(matDst2, CV_32F);dct(matDst1, matDst1);dct(matDst2, matDst2);int iAvg1 = 0, iAvg2 = 0;int arr1[64], arr2[64];for (int i = 0; i < 8; i++){uchar* data1 = matDst1.ptr<uchar>(i);uchar* data2 = matDst2.ptr<uchar>(i);int tmp = i * 8;for (int j = 0; j < 8; j++){int tmp1 = tmp + j;arr1[tmp1] = data1[j];arr2[tmp1] = data2[j];iAvg1 += arr1[tmp1];iAvg2 += arr2[tmp1];}}iAvg1 /= 64;iAvg2 /= 64;for (int i = 0; i < 64; i++){arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;}int iDiffNum = 0;for (int i = 0; i < 64; i++)if (arr1[i] != arr2[i])++iDiffNum;
// cout<<iDiffNum<<endl;return iDiffNum;
}//int main()
//{
// Mat img,templ,result;
// img = imread("../1.jpg");
// templ = imread("../2.jpg");
//
// int result_cols = img.cols - templ.cols + 1;
// int result_rows = img.rows - templ.rows + 1;
//
// result.create(result_cols,result_rows,CV_32FC1);
// matchTemplate(img, templ, result, CV_TM_SQDIFF_NORMED);
//
// Point minLoc;
// Point maxLoc;
// double minVal = -1;
// double maxVal;
//
// minMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,Mat());
// cout<<"minLoc.x:"<<minLoc.x<<endl;
// cout<<"minLoc.y:"<<minLoc.y<<endl;
// cout<<"result_cols:"<<result_cols<<endl;
//
// int ROI_rows =templ.rows - 0.05*templ.rows;
// int ROI_cols =templ.cols - 0.05 *templ.cols;
//
// Rect img_ROI = Rect(minLoc.x, minLoc.y,ROI_rows,ROI_cols);
//
// Mat ROI = img(img_ROI);
// pHash(ROI,templ);
//
//}int main()
{//加载图片Mat src_img,temp_img,result_img;src_img = imread("../1.jpg");temp_img = imread("../2.jpg");imshow("src_img",src_img);imshow("temp_img",temp_img);//构建结果图像,结果图像必须是单通道32位浮点型图像int result_cols = src_img.cols - temp_img.cols + 1; //result的尺寸大小int result_rows = src_img.rows - temp_img.rows + 1;result_img.create(result_cols, result_rows, CV_32FC1);int n = 0;//循环缩放模板图片for(int i = 0; i <10; i++){cout<<i<<endl;Mat temp_imgc = temp_img.clone();int temp_imgc_col = temp_img.cols - i * 0.05 * temp_img.cols;int temp_imgc_row = temp_img.rows - i * 0.05 * temp_img.rows;resize(temp_imgc,temp_imgc,Size(temp_imgc_col,temp_imgc_row));//进行模板匹配matchTemplate(src_img,temp_imgc,result_img,0);double minVal = -1;double maxVal;Point minLoc;Point maxLoc;Point matchLoc;minMaxLoc(result_img, &minVal, &maxVal, &minLoc, &maxLoc, Mat());Rect ROI = Rect(minLoc.x,minLoc.y,temp_imgc_row,temp_imgc_col);Mat img_show = src_img.clone();matchLoc = minLoc;//5.根据resultImg中的最大值位置在源图上画出矩形和中心点Point center = Point(minLoc.x + temp_imgc.cols / 2, minLoc.y + temp_imgc.rows / 2);rectangle(img_show, matchLoc, Point(matchLoc.x + temp_imgc.cols, matchLoc.y + temp_imgc.rows), Scalar(0, 255, 0), 1, 8, 0);// imshow("result",img_show);
// waitKey(0);//获取匹配得到区域Rect img_ROI = Rect(matchLoc,Point(matchLoc.x + temp_imgc.cols, matchLoc.y + temp_imgc.rows));Mat img = src_img.clone();Mat ROI_img = img(img_ROI);// imshow("ROI",ROI_img);
// waitKey(0);//进行相似度比较if(pHash(ROI_img,temp_img) < 20){n = pHash(ROI_img,temp_img);cout<<"n="<<n<<endl;imshow("zhy", img_show);waitKey(0);}// //获取模板匹配得到的区域
// double minVal;
// double maxVal;
// Point minLoc;
// Point maxLoc;
// minMaxLoc(result_img,&minVal,&maxVal,&minLoc,&maxLoc,Mat()); //找矩阵中最小位置点的坐标
// //画出ROI区域的矩形框
// Rect ROI = Rect(minLoc.x,minLoc.y,temp_imgc_row,temp_imgc_col);
//
// Mat result_img_ROI = result_img(ROI);
// cout<<i<<endl;
// imshow("show",result_img_ROI);
// waitKey(0);}
}
相关文章:

Opencv-C++笔记 (17) : 模板匹配
文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下: void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…...

Maven(四)常用命令大全
目录 一、mvn 命令参数二、mvn 插件命令1.介绍2.查看插件的使用文档3.常用的插件命令 官网地址: https://maven.apache.org/官方插件清单: https://maven.apache.org/plugins/index.html Maven 是一个强大的构建工具,它提供了许多命令来进行项…...

13.3 目标检测和边界框
锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框,可以生成 (n个缩放 m个宽高比 -1 )个锚框 锚框的作用: 不用直接去预测真实框的四个坐标,而是: 1.先生成多个锚框。 2.预测每个锚框里是否含有要预测…...

TCP/IP网络江湖初探:物理层的奥秘与传承(物理层上篇-基础与本质)
〇、引言 在这个数字时代,计算机网络如同广袤的江湖,数据在其中畅游,信息传递成为了生活的常态。然而,在这个充满虚拟奇观的网络江湖中,隐藏着一个不容忽视的存在,那就是物理层,这个江湖的基石。就如同江湖中的土地一样,物理层作为计算机网络的基础,承载着数据的最初转…...

计算机视觉五大核心研究任务全解:分类识别、检测分割、人体分析、三维视觉、视频分析
目录 一、引言1.1 计算机视觉的定义1.1.1 核心技术1.1.2 应用场景 1.2 历史背景及发展1.2.1 1960s-1980s: 初期阶段1.2.2 1990s-2000s: 机器学习时代1.2.3 2010s-现在: 深度学习的革命 1.3 应用领域概览1.3.1 工业自动化1.3.2 医疗图像分析1.3.3 自动驾驶1.3.4 虚拟现实与增强现…...

linux -- centos -- cmake 留坑
安装Cmake 在Linux一个目录下: touch poj.cpp touch CMakeLists.txtpoj.cpp的内容:随便输出一点东西啦 CMakeLists.txt的内容: cmake_minimum_required(VERSION 3.6) project(Test) add_executable(Test test.cpp)cmake_minimum_required:c…...

【100天精通python】Day33:使用python操作数据库_SQLite数据库的使用与实战
目录 专栏导读 1 SQLite 简介 2 SQLite数据库安装及使用 2.1 检查 SQLite 支持 2.2 创建数据库文件 2.2.1 使用 Python 创建数据库文件: 2.2.2 使用命令行创建数据库文件: 2.3 连接到 SQLite 数据库: 3 SQLite 中常用的SQL语句…...

通过将信号频谱与噪声频谱进行比较,自动检测适当的带通滤波器转折频率研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【Sklearn】基于多层感知器算法的数据分类预测(Excel可直接替换数据)
【Sklearn】基于多层感知器算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 多层感知器(Multilayer Perceptron,MLP)是一种前馈神经网络,用于解决分类和回归问题。它包含输入层、若干个隐…...

在 Windows 中恢复数据的 5 种方法
发生数据丢失的原因有多种。无论是因为文件被意外删除、文件系统或操作系统损坏,还是由于软件或硬件级别的存储故障,数据都会在您最意想不到的时候丢失。今天我们重点介绍五种数据恢复方法,以应对意外情况的发生。 1.从另一台机器启动硬盘 如…...

配置使用Gitee账号认证登录Grafana
三方社会化身份源 集成gitee第三方登录 第三方登录的原理 所谓第三方登录,实质就是 OAuth 授权。用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。 举例来…...

使用 Flask 部署 Next.js
原文 使用 Flask 部署 Next.js Flask 和 Next.js 是两个独特的开源 Web 框架,分别构建在 Python 和 JavaScript 编程语言之上。 您可以在没有 Next.js 的情况下构建 Flask 应用程序,也可以在没有 Flask 的情况下构建 Next.js 应用程序。但是࿰…...

网络安全--iptables
总结: iptables 的关键概念和功能: 规则(Rules): iptables 使用规则来定义特定的操作,例如允许或拒绝特定类型的网络流量。每条规则都由条件和操作组成。条件可以是源 IP 地址、目标 IP 地址、端口号等&a…...

【猿灰灰赠书活动 - 02期】- 【Java从入门到精通2023年7月最新(第7版)】
说明:博文为大家争取福利,与清华大学出版社合作进行送书活动 图书:《Java从入门到精通》 一、好书推荐 图书介绍 Java入门经典,95万Java程序员的入行选择。配备升级版Java开发资源库,在线大咖课在线答疑,学…...

Springboot 设置统一的请求返回格式
现在开发过程中主要采用前后端分离的方式进行开发测试,也就是前端封装请求,后端提供标准的API接口服务。一般现在json 格式受到开发者们的青睐,学习过程中我们可以设置接口的返回类型,那么怎么做到设置统一的返回格式呢࿱…...

logstash日志换行处理小解
logstash主用于日志实时数据收集、解析,并将数据转发的工具,内置的功能也相当强大。但,同时意味着,他可能接收到各种情况的数据。 此处,我们主要讲解我实际使用中,碰到的一个小问题,换行(\n)。…...

openpnp - 做一个抛料盒
文章目录 openpnp - 做一个抛料盒概述效果图零件 - 抛料盒主体零件 - 磁铁仓盖板END openpnp - 做一个抛料盒 概述 8mm散料飞达做回来了, 上面用的长方形磁铁(4x6x10mm)透过0.8mm的3D打印薄壁, 和固定铁板的吸力很大, 用磁力固定的非常好. 正好缺一个抛料盒, 就按照散料飞达的…...

数据结构——单链表的实现(c语言版)
前言 单链表作为顺序表的一种,了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷,但是单链表也有它存在的价值, 它也是作为其他数据结构的一部分出现的,比如在图,哈希表中。…...

【计算机组成原理】24王道考研笔记——第四章 指令系统
第四章 指令系统 一、指令系统 指令是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该 机的指令系统,也称为指令集。 指令格式: 1.1分类 按地址码数目分类: 按指令长度分类&…...

C#使用FileInfo和DirectoryInfo类来执行文件和文件夹操作
System.IO.FileInfo 和 System.IO.DirectoryInfo 是C#中用于操作文件和文件夹的类,它们提供了许多有用的方法和属性来管理文件和文件夹。 System.IO.FileInfo: FileInfo 类用于操作单个文件的信息和内容。以下是一些常用的方法和属性: Exi…...

每日一学——TCP/IP参考模型
TCP/IP参考模型是一个用于网络通信的分层架构,它定义了一组协议,这些协议实现了计算机之间的数据传输。TCP/IP参考模型分为四层: 应用层(Application Layer):应用层是网络应用程序与网络之间的接口层。它提…...

LAXCUS分布式操作系统:技术创新引领高性能计算与人工智能新时代
随着科技的飞速发展,高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中,LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现,成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技…...

两只小企鹅(Python实现)
目录 1 和她浪漫的昨天 2 未来的旖旎风景 3 Python完整代码 1 和她浪漫的昨天 是的,春天需要你。经常会有一颗星等着你抬头去看; 和她一起吹晚风吗﹖在春天的柏油路夏日的桥头秋季的公园寒冬的阳台; 这世界不停开花,我想放进你心里一朵&am…...

Linux | 使用wget命令调用服务接口
关注wx: CodingTechWork 引言 在docker容器中,想要调用某个服务接口,发现没有安装curl命令,但是有wget命令。本次总结一下wget的使用。 wget命令实践 容器访问 查看容器 docker ps进入容器 docker exec -it <container_id&…...

POJ Prime Path 埃氏筛法+广度优先搜索
思路:用埃氏筛法打个表,然后bfs即可 #include <iostream> #include <queue> using namespace std; typedef long long ll; ll inf 0x3f3f3f3f3f3f3f3f; bool isPrime[10007]; ll d[10007]; int tenPow[10]; int mint; void initTenPow() {…...

React React Native
文章目录 ReactReact vs Vue快速上手React,核心知识点JSX例子 组件虚拟DOM基于 React 的 UI 库跟Java、ObjectC交互 React Native基于 React Native 的 UI 库 React && React NativeReact && React Native 框架 React React 是一个用于构建用户界面…...

分布式定时任务系列5:XXL-job中blockingQueue的应用
传送门 分布式定时任务系列1:XXL-job安装 分布式定时任务系列2:XXL-job使用 分布式定时任务系列3:任务执行引擎设计 分布式定时任务系列4:任务执行引擎设计续 Java并发编程实战1:java中的阻塞队列 引子 这篇文章的…...

QT网络编程之TCP
QT网络编程之TCP TCP 编程需要用到俩个类: QTcpServer 和 QTcpSocket。 #------------------------------------------------- # # Project created by QtCreator 2023-08-...

《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern
定义 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 这是定义,看不懂就看不懂吧,我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…...

前端一键升级 package.json里面的依赖包管理
升级需谨慎 前端一键升级 package.json里面的依赖包管理 安装:npm-check-updates npm i npm-check-updates -g缩写 ncu 在项目根目录里面执行 ncu 如图:...