花老湿学习OpenCV:直方图、直方图的计算、均衡化、对比、反向投影
直方图概述:
在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征)。
也可以这么理解,直方图是对数据的统计,并把统计值显示到事先设定好的bin(矩形条)中,bin中的数值是从数据中计算出的特征的统计量。总之,直方图获取的是数据分布的统计图,通常直方图的维数要低于原始数据。
图像直方图是用一表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布的直方图。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。计算机视觉邻域常借助图像直方图来实现图像的二值化。
灰度直方图是一幅图像中个像素灰度值出现次数或频数的统计结果,它只反映该图像中灰度值出现的频率,而未反映某一灰度值像素所在的位置。也就是说,它只包含了该图像中某个灰度值的像素出现的概率,而丢失了其所在的位置的信息。
任一幅图像,都能唯一地算出一幅与它对应的直方图。但不同的图像,可能有相同的直方图。即图像与直方图之间是多对一的映射关系。
直方图意义:
1. 直方图是图像中像素强度分布的图形表达方式。
2. 直方图统计了每一个强度值所具有的像素个数。
直方图广泛应用于许多计算机视觉应用中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。通过在每个兴趣点设置一个有相近特征的直方图所构成的标签,用以确定图像中的兴趣点。边缘、色彩、角度等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图还可以用来识别网络视频是否被复制等。直方图是计算机视觉中最经典的工具之一,也是一个很好的图像特征表示手段。
一.直方图的计算与绘制:
API:
将BGR图像划分为单通道,再分别计算直方图:
代码如下:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{Mat src = imread("F:\\visual studio\\Image\\women2.jpg");if (src.empty()){cout << "Can't load the image" << endl;return -1;}//划分为单通道vector<Mat> bgr_planes;split(src, bgr_planes);//分别计算B、G、R通道的直方图//需要考虑的通道const int channels[1] = { 0 };//维数int dims = 1;//划分的子区间数 const int histsize[] = { 16 };//范围const float range[1][2] = { {0,256} };const float* histrange[] = { range[0] };Mat b_hist, g_hist, r_hist;//计算直方图calcHist(&bgr_planes[0], 1, channels, Mat(), b_hist, 1, histsize, histrange, true, false);calcHist(&bgr_planes[1], 1, channels, Mat(), g_hist, 1, histsize, histrange, true, false);calcHist(&bgr_planes[2], 1, channels, Mat(), r_hist, 1, histsize, histrange, true, false);//归一化int hist_h = 400;int hist_w = 512;int bin_w = cvRound(hist_w / histsize[0]);Mat histImage1(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));Mat histImage2(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));Mat histImage3(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));//归一化到直方图内normalize(b_hist, b_hist, 0, histImage1.rows, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, histImage2.rows, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, histImage3.rows, NORM_MINMAX, -1, Mat());/****对每个通道进行绘图****/ for (int i = 1; i <= histsize[0]; i++){rectangle(histImage1, Rect(Point((i - 1)*bin_w, hist_h-1), Point((i*bin_w) - 1, hist_h - cvRound(b_hist.at<float>( i - 1)))), Scalar(255, 0, 0), FILLED, 8);rectangle(histImage2, Rect(Point((i - 1)*bin_w, hist_h - 1), Point((i*bin_w) - 1, hist_h - cvRound(g_hist.at<float>(i - 1)))), Scalar(0, 255, 0), FILLED, 8);rectangle(histImage3, Rect(Point((i - 1)*bin_w, hist_h - 1), Point((i*bin_w) - 1, hist_h - cvRound(r_hist.at<float>(i - 1)))), Scalar(0, 0, 255), FILLED, 8);}imshow("histImage1", histImage1);imshow("histImage2", histImage2);imshow("histImage3", histImage3);cv::waitKey(0);cv::destroyAllWindows();return 0;}
效果如下:
将BGR转化为HSV,对H、S通道的像素进行统计,计算直方图,即色调-饱和度直方图,这是一个二维图像,我们用颜色的深浅表示该区域的分布情况。
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{Mat src = imread("F:\\visual studio\\Image\\bird.jpg");if (src.empty()){cout << "Can't load the image" << endl;return -1;}Mat hsv;cvtColor(src, hsv, COLOR_BGR2HSV);//选择前个通道0,1const int channels[] = { 0,1 };//维数等于chanels中元素的个数int dims = 2;//划分的子区间数 int hbins = 18;int sbins = 16;const int histsize[] = { hbins,sbins };//范围const float range[2][2] = { {0,180},{0,256}};const float* histrange[] = { range[0],range[1]};Mat hist;//计算直方图calcHist(&hsv, 1, channels, Mat(), hist, dims, histsize, histrange, true, false);int scale = 30;Mat histImage(sbins*scale, hbins*scale, CV_8UC3, Scalar(0, 0, 0));//获得其中的最大值 /*double maxVal = 0;minMaxLoc(hist, 0, &maxVal, 0, 0);*///归一化normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());for (int i = 0; i < hbins; i++){for (int j = 0; j < sbins; j++){/*float binVal = hist.at<float>(i, j);int intensity = cvRound(binVal * 255 / maxVal);*/ int intensity = hist.at<float>(i, j);//左下角代表(hbin0,sbin0)rectangle(histImage, Rect(Point(i*scale, histImage.rows - 1-j*scale), Point(((i+1)*scale) - 1, histImage.rows -1-((j+1)*scale) )),Scalar(intensity,0,0), FILLED, 8);}}imshow("histImage", histImage); waitKey(0);return 0;
}
效果如下:
二.直方图均衡化:
直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。
均衡的具体过程可以参考此博文(如果有更好的原理介绍,欢迎在下方评论):
直方图均衡化原理 - 天涯路清晨 - 博客园 https://www.cnblogs.com/tianyalu/p/5687782.html
直方图均衡化的数学原理 - mjiansun的专栏 - CSDN博客 https://blog.csdn.net/u013066730/article/details/82969768
说明一下直方图均衡化如何提高图像对比度:
以下图为例,图像的灰度值大都集中在中间部分,而在均衡化之后,增加了两端灰度值的分布,也就是增加了最亮的(白色)和最暗(黑色)的部分,可以提高对比度。(文采不行,大家知道啥意思就可以)
API:
直方图均衡化代码实例:
对灰度图进行直方图均衡:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{Mat src = imread("F:\\visual studio\\Image\\desert.jpg");if (src.empty()){cout << "Can't load the image" << endl;return -1;}//转化为灰度图Mat graysrc;cvtColor(src, graysrc, COLOR_BGR2GRAY);imshow("graysrc", graysrc);//计算直方图Mat hist;const int channels[] = { 0 };const int histsize[] = { 32 };const float range[] = { 0,256 };const float* histrange[] = { range };calcHist(&graysrc, 1, channels, Mat(), hist, 1, histsize, histrange, true, false);//归一化int hist_h = 400;int hist_w = 512;int bin_w = cvRound(hist_w / histsize[0]);normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1, Mat());Mat histImage(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));//绘制直方图for (int i = 0; i < histsize[0]; i++){rectangle(histImage, Rect(Point(i*bin_w,hist_h-1), Point((i+1)*bin_w-1,hist_h-1-hist.at<float>(i))), Scalar(255, 0, 0), FILLED, LINE_AA);}imshow("hist1", histImage);//直方图均衡化Mat dst;equalizeHist(graysrc, dst);imshow("dst", dst);//再计算直方图并绘制 观察区别Mat dsthist;calcHist(&dst, 1, channels, Mat(), dsthist, 1, histsize, histrange, true, false);normalize(dsthist, dsthist, 0, hist_h, NORM_MINMAX, -1, Mat());Mat dsthistImage(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));for (int i = 0; i < histsize[0]; i++){rectangle(dsthistImage, Rect(Point(i*bin_w, hist_h - 1), Point((i + 1)*bin_w - 1, hist_h - 1 - dsthist.at<float>(i))), Scalar(255, 0, 0), FILLED, LINE_AA);}imshow("hist2", dsthistImage);waitKey(0);}
效果如下:
对BGR图像进行直方图均衡,划为分多个单通道后,分别进行直方图均衡,然后再融合:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;void calcuateHist(vector<Mat> &,const string * win);int main()
{Mat src = imread("F:\\visual studio\\Image\\desert.jpg");if (src.empty()){cout << "Can't load the image" << endl;return -1;}imshow("src", src);//划分为单通道vector<Mat> bgr_planes;split(src, bgr_planes);string win[3] = { "hist1","hist2","hist3" };//计算直方图calcuateHist(bgr_planes,win);//直方图均衡equalizeHist(bgr_planes[0], bgr_planes[0]);equalizeHist(bgr_planes[1], bgr_planes[1]);equalizeHist(bgr_planes[2], bgr_planes[2]);string dstwin[3] = { "dsthist1","dsthist2","dsthist3" };//计算直方图calcuateHist(bgr_planes, dstwin);Mat dst;//通道融合merge(bgr_planes,dst);imshow("dst", dst);cv::waitKey(0);cv::destroyAllWindows();return 0;
}void calcuateHist(vector<Mat> & bgr_planes,const string * win)
{//分别计算B、G、R通道的直方图//需要考虑的通道const int channels[1] = { 0 };//维数int dims = 1;//划分的子区间数 const int histsize[] = { 16 };//范围const float range[1][2] = { {0,256} };const float* histrange[] = { range[0] };Mat b_hist, g_hist, r_hist;//计算直方图calcHist(&bgr_planes[0], 1, channels, Mat(), b_hist, 1, histsize, histrange, true, false);calcHist(&bgr_planes[1], 1, channels, Mat(), g_hist, 1, histsize, histrange, true, false);calcHist(&bgr_planes[2], 1, channels, Mat(), r_hist, 1, histsize, histrange, true, false);//归一化int hist_h = 400;int hist_w = 512;int bin_w = cvRound(hist_w / histsize[0]);Mat histImage1(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));Mat histImage2(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));Mat histImage3(hist_h, bin_w*histsize[0], CV_8UC3, cv::Scalar(0, 0, 0));//归一化到直方图内normalize(b_hist, b_hist, 0, histImage1.rows, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, histImage2.rows, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, histImage3.rows, NORM_MINMAX, -1, Mat());/****对每个通道进行绘图****/for (int i = 1; i <= histsize[0]; i++){rectangle(histImage1, Rect(Point((i - 1)*bin_w, hist_h-1), Point((i*bin_w) - 1, hist_h - cvRound(b_hist.at<float>( i - 1)))), Scalar(255, 0, 0), FILLED, 8);rectangle(histImage2, Rect(Point((i - 1)*bin_w, hist_h - 1), Point((i*bin_w) - 1, hist_h - cvRound(g_hist.at<float>(i - 1)))), Scalar(0, 255, 0), FILLED, 8);rectangle(histImage3, Rect(Point((i - 1)*bin_w, hist_h - 1), Point((i*bin_w) - 1, hist_h - cvRound(r_hist.at<float>(i - 1)))), Scalar(0, 0, 255), FILLED, 8);}imshow(win[0], histImage1);imshow(win[1], histImage2);imshow(win[2], histImage3);
}
效果如下: (并不是对所有图像使用直方图均衡都可以提高对比度,有的会降低对比度或者使图像失真,一般直方图分布情况如下时,使用直方图均衡化可以提高对比度)
绘制直方图时,当时for循环i变量的取值范围写错了,所以直方图最右面的部分没画出来!!
直方图匹配(规定化):
OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现) - konglongdanfo - 博客园 https://www.cnblogs.com/konglongdanfo/p/9215091.html
直方图的对比:
直方图比较,是用一定的标准来判断两个直方图的相似度方法;
Opencv提供的比较方法有四种:
匹配方法有四种 :
CV_COMP_CHISQ卡方,返回值越小匹配度越高
CV_COMP_CORREL相关性匹配,返回值越大匹配程度越高
CV_COMP_INTERSECT 直方图相交,返回值越大匹配度越高
CV_COMP_BHATTACHARYYA返回值越小匹配度越高.
API:
代码示例:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{Mat src1, src2, hsv1, hsv2;src1 = imread("F:\\visual studio\\Image\\compare1.jpg");if (src1.empty()){cout << "Can't load the image" << endl;return -1;}src2 = imread("F:\\visual studio\\Image\\compare2.jpg");if (src1.empty()){cout << "Can't load the image" << endl;return -1;}//转化到HSV色彩空间cvtColor(src1, hsv1, COLOR_BGR2HSV);cvtColor(src2, hsv2, COLOR_BGR2HSV);//选择HSV图像的前个通道0,1const int channels[] = { 0,1 };//维数等于chanels中元素的个数int dims = 2;//划分的子区间数 int hbins = 50;int sbins = 60;const int histsize[] = { hbins,sbins };//范围const float range[2][2] = { {0,180},{0,256} };const float* histrange[] = { range[0],range[1] };Mat hist1,hist2;//计算直方图calcHist(&hsv1, 1, channels, Mat(), hist1, dims, histsize, histrange, true, false);normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());calcHist(&hsv2, 1, channels, Mat(), hist2, dims, histsize, histrange, true, false);normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());//按顺序使用4种对比标准将src1图像的直方图与src1,src2的直方图进行对比for (int i = 0; i < 4; i++){int compare_method = i;double src1src1 = compareHist(hist1, hist1, compare_method);double src1src2 = compareHist(hist1, hist2, compare_method);putText(src1, to_string(src1src1), Point(20, 40 * i + 30), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 0), 2, LINE_AA);putText(src2, to_string(src1src2), Point(20, 40 * i + 30), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 0), 2, LINE_AA);}imshow("src1", src1);imshow("src2", src2);waitKey(0);return 0;
}
我们利用四种方法将src1分别与自身和src2进行比较,得出的结果显示在图片上,效果如下:
直方图反向投影:
如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的直方图可以看做是一个概率函数,其表现形式是某个像素属于该纹理或物体的概率。而反向投影就是一种记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法。
简单的讲,所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征的方法。
使用统计学语言进行分析,反向投影中储存的数值代表了图像中该像素属于区域的概率。
工作原理:
以使用H-S肤色直方图为例来解释反向投影的工作原理:
1.代码实现:
这里是在代码中选取ROI,之前这种方式一直得不到我想要的结果,后来找到了错误原因,已经记录在代码注释中。
被测图像是博主的手部图像,截取一部分区域作为目标图像,建立H-S直方图,反向变换后,显示结果。
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int hbins = 6;int sbins = 8;Mat srchsv;Mat hsv;void calcBackPro_demo(int pos, void* userdata);int main()
{Mat src = imread("F:\\visual studio\\Image\\hand1.jpg");if (src.empty()){cout << "Can't load the image" << endl;return -1;}//长宽都变为原来的0.5倍 (我加载的图片太大了 不好显示)resize(src, src, Size(), 0.5, 0.5);imshow("src", src);//利用代码截取ROI//为了显示所取的区域Mat src1;src.copyTo(src1);rectangle(src1, Rect(src.cols / 3 , 2 * src.rows / 3 , 50, 50), Scalar(0, 0, 255), 2, LINE_AA);imshow("src", src1);Mat base = src( Rect(src.cols / 3 , 2 * src.rows / 3 , 50, 50));手动截取ROI 并保存 //Mat base = imread("F:\\visual studio\\Image\\hand3.jpg");//if (base.empty())//{// cout << "Can't load the image" << endl;// return -1;//}imshow("base", base);//转化至HSV色彩空间//记录一下易错点:cvtColor(src, src, COLOR_BGR2HSV);//若这些写,src被转化为hsv空间,但是我们的base是通过ROI方式获得的,与src共享同一块区域,//此举也会更改base,最后得不到我们想要的效果!!cvtColor(src, srchsv, COLOR_BGR2HSV);cvtColor(base, hsv, COLOR_BGR2HSV);namedWindow("dst", WINDOW_AUTOSIZE);createTrackbar("Hbins", "dst", &hbins, 60, calcBackPro_demo);setTrackbarMin("Hbins", "dst", 2);createTrackbar("Sbins", "dst", &sbins, 64, calcBackPro_demo);setTrackbarMin("Sbins", "dst", 2);calcBackPro_demo(0, 0);waitKey(0);}void calcBackPro_demo(int pos, void* userdata)
{//计算直方图const int channels[] = { 0,1 };const int histsize[] = { hbins,sbins };const float range[2][2] = { {0,180},{0,256} };const float * histranges[] = { range[0],range[1] };Mat hist;calcHist(&hsv, 1, channels, Mat(), hist, 2, histsize, histranges, true, false);//归一化直方图数值至0-255;normalize(hist, hist, 0, 255, NORM_MINMAX);//绘制直方图int hist_h = 512;int hist_w = 540;int bin_h = cvRound( hist_w / hbins); //hbin区间的宽度int bin_s = cvRound( hist_h / sbins); //sbin区间的宽度Mat histImage(hbins*bin_h, sbins*bin_s, CV_8UC3, Scalar(0,0,0));for (int i = 0; i < hbins; i++){for (int j = 0; j < sbins; j++){int intensity = cvRound(hist.at<float>(i, j));rectangle(histImage, Rect(Point(i*bin_h, histImage.rows - 1 - j * bin_s), Point((i + 1)*bin_h -1, histImage.rows - (j + 1)*bin_s)), Scalar(intensity,0,0), FILLED, LINE_AA);}}imshow("histImage", histImage);//反向投影Mat backProject;calcBackProject(&srchsv, 1, channels, hist, backProject, histranges, 1, true);imshow("dst", backProject);}
效果如下:
通过调节Hbins,Sbins,可以改变反向投影的效果:
花老湿学习OpenCV:直方图、直方图的计算、均衡化、对比、反向投影相关推荐
- 花老湿学习OpenCV:分水岭原理和实现watershed()
在很多实际应用中,我们需要分割图像,分割方法有多种经典的分割方法: 常见图像分割方法: 1.基于边缘检测的方法: 此方法主要是通过检测区域的边缘进行分割,利用区域之间的特征的不一致性,首先检测图像中的 ...
- 花老湿学习OpenCV:霍夫线变换与直线检测
引言: 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集 ...
- OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配
直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...
- 《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection)
9.4 反向投影(back projection) 9.4.1 反向投影原理 1.基本思想: 反向投影中储存的数值代表了图像中该像素属于区域的概率,计算某一特征的直方图模型,使用模型寻找图像中存在 ...
- opencv中 equalizeHist()均衡化直方图
1.EqualizeHist函数 函数作用: 直方图均衡化,,用于提高图像的质量 2.EqualizeHist函数调用形式 C++: void equalizeHist(InputArray src, ...
- Python-OpenCV 处理图像(四)(五):图像直方图和反向投影 图像中边界和轮廓检测
当我们想比较两张图片相似度的时候,可以使用这一节提到的技术 直方图对比 反向投影 关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码: 0x01. 绘制直方图 import cv2.cv a ...
- Python-OpenCV 处理图像(四):图像直方图和反向投影
当我们想比较两张图片相似度的时候,可以使用这一节提到的技术 直方图对比 反向投影 关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码: 0x01. 绘制直方图 import cv2.cv a ...
- OpenCV中反向投影
OpenCV中反向投影 首先要说的可能要说的就是反向投影,用一个看到的例子来说可能更直观一些. [1234567891011129101315]\begin{bmatrix}1&2&3 ...
- opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...
最新文章
- windows 2008 64位oracle11g部署问题(3)之ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务...
- ios开发多线程篇--异步加载网络图片GCD
- golang内置接口error
- ~~做过的好玩的题~~
- thymeleaf 中文文档
- 解决 sessionStroage 无法在多个标签页共享数据的问题
- [ZJOI2016]大森林
- ux.form.field.Year 只能选年的时间扩展
- Sencha-命令-CMD(与Touch的结合运用)(官网文档翻译30)
- python数据导出excel_python实现数据导出到excel的示例
- 【ENVI解决经验】一处理图像就报错
- apache设置域名绑定 以及绑定不起作用的排查.
- 易筋SpringBoot 2.1 | 第六篇:JdbcTemplate访问MySQL
- Linux命令和vim的使用
- python代码库-这7个开源的Python库,让你轻松代码分析
- 【硕博士推荐】国内有哪些不错的CV(计算机视觉)团队?
- 【python】程序结构
- 自媒体时代如何做好软文推广?
- SQL语句-各种查询
- 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation
热门文章
- 东北育才高中2021年高考成绩查询,东北育才学校2020年高考成绩喜报
- Elasticsearch 入门
- mysqlOracle导入导出txt格式的数据
- 设计中的设计-设计的意义
- LeetCode 826 Most Profit Assigning Work
- 六、hibernate表与表之间的关系(多对多关系)
- matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究
- java timsort_JDK(二)JDK1.8源码分析【排序】timsort
- 阻止路由跳转得方式_vue路由拦截及页面跳转设置的方法介绍
- kafka启动异常InconsistentClusterIdException