opencv学习笔记(更新中…)

写在前面,opencv官方文档。
地址:https://docs.opencv.org/4.x/index.html
ps:markdown导入csdn是真麻烦,本地图片需要单独上再传调整html格式。

一、基础操作

1、图像的读取与显示

函数原型:

读取图像:imread()
显示图像:imshow()

代码演示:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat src = imread("D:/ziliao/codelearning/opencv/code/aa1.png",IMREAD_GRAYSCALE);  //BGR //IMREAD_GRAYSCALE加载灰度图if (src.empty()) {cout << "could not load image..." << endl;return -1;}//手动创建窗口namedWindow("输入窗口", WINDOW_FREERATIO);imshow("输入窗口", src);  //只支持8位图像或浮点图像waitKey(0); //程序阻塞 图片窗口停留destroyAllWindows();return 0;
}

2、色彩空间转换与读出

2.1、色彩空间转换函数-- cvtColor()

COLOR_BGR2GRAY = 6 彩色到灰度
COLOR_GRAY2BGR = 8 灰度到彩色
COLOR_BGR2HSV = 40 BGR到HSV
COLOR_HSV2BGR = 54 HSV到BGR

2.2 图像保存- imwrite(pra1, pra2)

pra1–图像保存的路径
pra2–图像内存对象

代码示例

void QuickDemo::colorSpace_Demo(Mat& image) { Mat gray, hsv;cvtColor(image, hsv, COLOR_BGR2HSV);//H 0~180 S、V 0-255//H、S表示颜色  V表示亮度cvtColor(image, gray, COLOR_BGR2GRAY);imshow("HSV", hsv);imshow("灰度", gray);imwrite("D:/ziliao/codelearning/opencv/code/hsv.png", hsv);imwrite("D:/ziliao/codelearning/opencv/code/gray.png", gray);
}

3、图像的创建与赋值

C++中的Mat对象与创建
python中numpy数组对象

  • 赋值
  • 拷贝/克隆

Mat的基本结构

#mermaid-svg-zxbyRHiYU1P9lU82 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .error-icon{fill:#552222;}#mermaid-svg-zxbyRHiYU1P9lU82 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zxbyRHiYU1P9lU82 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zxbyRHiYU1P9lU82 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zxbyRHiYU1P9lU82 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zxbyRHiYU1P9lU82 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zxbyRHiYU1P9lU82 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zxbyRHiYU1P9lU82 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zxbyRHiYU1P9lU82 .marker.cross{stroke:#333333;}#mermaid-svg-zxbyRHiYU1P9lU82 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zxbyRHiYU1P9lU82 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .cluster-label text{fill:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .cluster-label span{color:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .label text,#mermaid-svg-zxbyRHiYU1P9lU82 span{fill:#333;color:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .node rect,#mermaid-svg-zxbyRHiYU1P9lU82 .node circle,#mermaid-svg-zxbyRHiYU1P9lU82 .node ellipse,#mermaid-svg-zxbyRHiYU1P9lU82 .node polygon,#mermaid-svg-zxbyRHiYU1P9lU82 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zxbyRHiYU1P9lU82 .node .label{text-align:center;}#mermaid-svg-zxbyRHiYU1P9lU82 .node.clickable{cursor:pointer;}#mermaid-svg-zxbyRHiYU1P9lU82 .arrowheadPath{fill:#333333;}#mermaid-svg-zxbyRHiYU1P9lU82 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zxbyRHiYU1P9lU82 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zxbyRHiYU1P9lU82 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zxbyRHiYU1P9lU82 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zxbyRHiYU1P9lU82 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zxbyRHiYU1P9lU82 .cluster text{fill:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 .cluster span{color:#333;}#mermaid-svg-zxbyRHiYU1P9lU82 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zxbyRHiYU1P9lU82 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

数据部分/头部
header
data block

代码示例

void  QuickDemo::mat_creation_demo(Mat& image) {Mat m1, m2;m1 = image.clone(); //图像克隆 拷贝image.copyTo(m2);//创建空白图像Mat m3 = Mat::zeros(Size(400,400), CV_8UC3);  //8位无符号数 3通道//opencv运算符都已被重载  对mat的操作可以直接使用//赋值m3 = Scalar(255, 0, 0);//宽度 高度 通道cout << "width:" << m3.cols << " height:" << m3.rows << " channels:" << m3.channels() << endl;//cout << m3 << endl;//imshow("创建图像", m3);Mat m4 = m3;Mat m5 = m3.clone(); //copyTo() 也是一样浅拷贝//m4 = Scalar(0, 255, 255);  //m3被改变  深拷贝m5 = Scalar(0, 255, 255);  //m3不被改变  浅拷贝imshow("m3", m3); }

4、图像像素的读写操作

操作像素,即操作mat数组中的值;

  • 单通道
  • 双通道
void QuickDemo::pixel_visit_demo(Mat& image) {int w = image.cols;int h = image.rows;int dims = image.channels();//使用数组下标for (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {//反相if (dims == 1) {int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = 255 - pv;}if (dims == 3) {Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}//使用指针for (int row = 0; row < h; row++) {uchar* current_row = image.ptr<uchar>(row);for (int col = 0; col < w; col++) {//反相if (dims == 1) {int pv = *current_row;*current_row++ = 255 - pv;}if (dims == 3) {*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}imshow("像素读写演示", image);
}

5、图像像素的算术操作

saturate_cast<uchar>() : 防止溢出,限定在0~255范围

图像的加减乘除运算:

void QuickDemo::operators_demo(Mat& image) {Mat dst;Mat m = Mat::zeros(image.size(), image.type());m = Scalar(2, 2, 2);dst = image / m;dst = image * 2; //运算操作multiply(image, m, dst);add(image, m, dst);divide(image, m, dst);subtract(image, m, dst);imshow("操作", dst);
}

6、键盘响应

key = waitKey(delay) 函数:
key – 键值的ascci码
delay – 延时时间(ms)

//键盘响应示例
void QuickDemo::key_demo(Mat& image) {Mat dst = Mat::zeros(image.size(), image.type());while (true) {      char c = waitKey(1);  //c为按下的键的ascii码if (c == 27) { //escbreak;}if (c == 49) { //#1cout << "you enter key #1" << endl;cvtColor(image, dst, COLOR_BGR2GRAY);}if (c == 50) {  //#2cout << "you enter key #2" << endl;cvtColor(image, dst, COLOR_BGR2HSV);}if (c == 51) {  //#3cout << "you enter key #3" << endl;dst = Scalar(50, 50, 50);add(image, dst, dst );}imshow("键盘响应", dst);}
}

7、图像像素的逻辑操作

void QuickDemo::bitwise_demo(Mat& image) {Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);//绘制矩形色块rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);imshow("m1", m1);imshow("m2", m2);Mat dst1;Mat dst2;Mat dst3;bitwise_and(m1, m2, dst1);  //位逻辑与bitwise_or(m1, m2, dst2);  //或bitwise_not(m1, dst3);    //非imshow("and", dst1);imshow("or", dst2);imshow("not", dst3);
}

输出结果:

8、通道分离与合并

//函数原型:
通道分离:split()
通道合并:merge()
通道混合:void cv::mixChannels(
const Mat * src,    //输入图像
size_t  nsrcs,      //输入图像个数
Mat * dst,      //输出图像
size_t  ndsts,      //输出个数
const int * fromTo, //混合对
size_t  npairs      //对数
)

代码示例

//示例
void QuickDemo::channels_demo(Mat& image) {vector<Mat> mv; //容器装载多个图像split(image, mv);  //通道分离imshow("B", mv[0]);imshow("G", mv[1]);imshow("R", mv[2]);Mat dst;merge(mv, dst);  //合并通道imshow("合并", dst);//通道混合int from_to[] = { 0,2,1,1,2,0 };//通道 0->2  1->1  2->0mixChannels(&image, 1, &dst, 1, from_to, 3);//参数:(输入,输入个数,输出,输出个数,混合参数对,对数)imshow("通道混合", dst);
}

9、图像像素值统计

minMaxLoc
meanStdDev方法

void QuickDemo::pixel_statistic_demo(Mat& image) {double minv, maxv;Point minLoc, maxLoc;vector<Mat> mv;split(image, mv);for (int i = 0; i < mv.size(); i++) {//提取最大最小像素值 位置minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());cout << "no.channels:" << i << "min value" << minv << "max value" << maxv << endl;}Mat mean, stddev;//灰度均值 方差统计meanStdDev(image, mean, stddev);cout << "means:" << mean << endl;cout << "stddev" << stddev << endl;//opencv库中运算符均已被重载,可直接输出任何格式的数据类型
}

10、几何形状绘制

//常见形状绘制
void QuickDemo::drawing_demo(Mat& image) {Rect rect;rect.x = 100;rect.y = 100;rect.width = 200;rect.height = 200;//绘制图形rectangle(image, rect, Scalar(0, 0, 255), -1, 8, 0);circle(image, Point(350, 400), 15, Scalar(0, 0, 255), -1, 8, 0);//line  线//ellipse  椭圆imshow("图形绘制", image);
}
//任意多边形绘制
void QuickDemo::polyline_drawing_demo() {Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);Point p1(100, 100);Point p2(350, 100);Point p3(450, 280);Point p4(320, 450);Point p5(80, 400);vector<Point> pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);//方法一polylines(canvas, pts, true, Scalar(0, 255, 0), 2,LINE_AA, 0);//方法二:轮廓绘制vector<vector<Point>> contours;contours.push_back(pts);drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1);imshow("多边形", canvas);
}

11、鼠标操作与响应(鼠标绘制roi区域)

实现用鼠标绘制图像中的roi区域

//鼠标操作与响应
Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
static void on_draw(int event, int x, int y, int flags, void* userdata) {Mat image = *((Mat*)userdata);//起点if (event == EVENT_LBUTTONDOWN) {sp.x = x;sp.y = y;cout << "start point: " << sp << endl;}//终点else if(event==EVENT_LBUTTONUP){ep.x = x;ep.y = y;int dx = abs(ep.x - sp.x);int dy = abs(ep.y - sp.y);Rect box(sp.x, sp.y, dx, dy);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("mouse drawing", image);//提取roi区域imshow("ROI region", image(box));//到达终点 更新起点坐标sp.x = -1;sp.y = -1;}//移动过程实时中绘制else if (event == EVENT_MOUSEMOVE) {if (sp.x > 0 && sp.y > 0) {ep.x = x;ep.y = y;int dx = abs(ep.x - sp.x);int dy = abs(ep.y - sp.y);Rect box(sp.x, sp.y, dx, dy);//更新原图 防止绘制叠加temp.copyTo(image);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("mouse drawing", image);}}
}void QuickDemo::mouse_drawing_demo(Mat &image) {namedWindow("mouse drawing", WINDOW_AUTOSIZE);setMouseCallback("mouse drawing", on_draw,(void*)(&image));imshow("mouse drawing", image);//用于更新原图temp = image.clone();
}

实现效果

12、图像像素类型转换与归一化

//像素类型转换与归一化
void QuickDemo::norm_demo(Mat& image) {Mat dst;cout << image.type() << endl; //CV_8UC3//类型转换image.convertTo(image, CV_32F);cout << image.type() << endl;//数据类型转换后,必须进行归一化处理//数据归一化normalize(image, dst, 1.0, 0, NORM_MINMAX);//转换到0-1cout << dst.type() << endl;imshow("归一化前", image);imshow("归一化后", dst);}

处理结果

13、图像的放缩与插值

void QuickDemo::resize_demo(Mat& image) {Mat zoomin, zoomout;int h = image.rows;int w = image.cols;resize(image, zoomout, Size(w / 2, h / 2), 0, 0, INTER_LINEAR);resize(image, zoomin, Size(w * 1.5, h * 1.5), 0, 0, INTER_LINEAR);imshow("zoomout", zoomout); //缩小imshow("zoomin", zoomin);  //放大
}

14、图像翻转/旋转

void QuickDemo::flip_demo(Mat& image) {Mat dst;flip(image, dst, 0); //上下翻转flip(image, dst, 1); //左右翻转flip(image, dst, -1); //旋转180°imshow("图像翻转", dst);
}
void QuickDemo::rotate_demo(Mat& image) {Mat dst, M;int w = image.cols;int h = image.rows;//2x3的矩阵 旋转矩阵 旋转中心坐标M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0); //旋转中心,角度//不改变旋转图片大小  计算图像尺寸double cos = abs(M.at<double>(0, 0));double sin = abs(M.at<double>(0, 1));int nw = cos * w + sin * h;int nh = sin * w + cos * h;//新的旋转中心M.at<double>(0, 2) += (nw / 2 - w / 2);M.at<double>(1, 2) += (nh / 2 - h / 2);cout << "旋转矩阵"<< M << endl;warpAffine(image, dst, M, Size(nw,nh), INTER_LINEAR, 0, Scalar(255, 255, 0));imshow("旋转", dst);
}

旋转效果

15、相机驱动/视频文件读取

//相机驱动
void QuickDemo::video_demo(Mat& image) {VideoCapture capture(0);
//  VideoCapture capture("路径"); //读取视频Mat frame;while (true) {capture.read(frame);if (frame.empty()) {break;}imshow("frame",frame);//  to do something...int c = waitKey(1);if (c == 27) {break;}}capture.release();
}

16、图像直方图

  • 灰度直方图
  • 颜色直方图

图像直方图是图像像素的统计学特征、计算代价较小,具有图像平移、旋转、缩放不变性等众多优点。广泛应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类、反向投影跟踪。

//函数原型
calcHist(&bgr_plane[0],1,0,Mat(),b_hist,1,bins,ranges);
cv.calcHist([image],[i],None,[256],[0,256]);
//注:Bins是指直方图的大小范围,对于像素值取值在0~255之间的,最少有256个bin,此外还可以有16、32、48、128等。
void QuickDemo::showHistogram_demo(Mat& image) {Mat image_gray, hist; //灰度图,直方图cvtColor(image, image_gray, COLOR_BGR2GRAY);  //灰度化imshow(" image_gray", image_gray);   //显示灰度图像//获取图像直方图int histsize = 256;float ranges[] = { 0,256 };const float* histRanges = { ranges };calcHist(&image_gray, 1, 0, Mat(), hist, 1, &histsize, &histRanges, true, false);//创建直方图显示图像int hist_h = 300;//直方图的图像的高int hist_w = 512; //直方图的图像的宽int bin_w = hist_w / histsize;//直方图的等级Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));//绘制直方图显示的图像//绘制并显示直方图normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1, Mat());//归一化直方图for (int i = 1; i < histsize; i++){line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1))),Point((i)*bin_w, hist_h - cvRound(hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);}imshow("histImage", histImage);//直方图均衡化Mat image_enhanced;equalizeHist(image_gray, image_enhanced);//直方图均衡化imshow(" image_enhanced", image_enhanced);   //显示增强图像//二维直方图//直方图匹配:将一张图像的直方图转变为规定形状的直方图而进行图像增强的方法
}

效果演示:


17、图像卷积操作

opencv自带了各种卷积操作的api函数

示例

void QuickDemo::blur_demo(Mat& image) {//自带卷积操作函数  Mat dst;blur(image, dst, Size(2, 2), Point(-1, -1)); //平滑imshow("图像模糊", dst);bilateralFilter(image, dst, 0, 100, 10); //高斯双边滤波imshow("高斯双边模糊", dst);
}

高斯双边滤波美颜效果

手动卷积操作

//手动卷积
void QuickDemo::convlution_demo(Mat& image) {//sobel边缘检测算子Mat Kernel_sobel = (Mat_<double>(3, 3) <<-1, 0, 1,-2, 0, 2,-1, 0, 1);//灰度化Mat image_gray;cvtColor(image, image_gray, COLOR_BGR2GRAY);  imshow("gray", image_gray);//参数Mat InputImage = image_gray;Mat OutputImage = Mat::zeros(image_gray.size(), image_gray.type());Mat kernel = Kernel_sobel;//计算卷积核的半径int sub_x = kernel.cols / 2;int sub_y = kernel.rows / 2;//遍历图片,除边界以外每个像素for (int image_y = 0; image_y < InputImage.rows - 2 * sub_y; image_y++){for (int image_x = 0; image_x < InputImage.cols - 2 * sub_x; image_x++){int pix_value = 0;//用来累加每个位置的乘积for (int kernel_y = 0; kernel_y < kernel.rows; kernel_y++)//对每一个点根据卷积模板进行卷积{for (int kernel_x = 0; kernel_x < kernel.cols; kernel_x++){double  weight = kernel.at<double>(kernel_y, kernel_x);int value = (int)InputImage.at<uchar>(image_y + kernel_y, image_x + kernel_x); //此处卷积核局部坐标系原点应该在核中心pix_value += weight * value;}}//此处卷积核局部坐标系原点应该在核中心,故向右下偏移核的半径距离OutputImage.at<uchar>(image_y + sub_y, image_x + sub_x) = saturate_cast<uchar>((int)pix_value);//转换为无符号类型 防止溢出}}//此方法忽略了图像半径长度边缘的部分imshow("sobel", OutputImage);}

opencv基础笔记相关推荐

  1. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  2. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  3. opencv学习笔记2:图像处理基础

    学习笔记 来源于淘宝的一个视频,记录下学习笔记. 图像由像素组成: 任何一个图,有很多点构成,每一个点,我们管它叫像素. 如图,左边图和右边图时同一个事物.不同点是左边点比较大,右边比较细腻.看起来不 ...

  4. OpenCV学习笔记大集锦

    转载自: OpenCV学习笔记大集锦 – 视觉机器人 http://www.cvrobot.net/collect-opencv-resource-learn-study-note-chinese/ ...

  5. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  7. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  8. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  9. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

最新文章

  1. mybatis结合log4j打印SQL日志
  2. 开始学习吧,《算法》:动态连通性练习
  3. [codeforces 508E]Maximum Matching
  4. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
  5. 将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录
  6. 使用logdashboard查看可视化日志
  7. 史上最详细之Centos7安装与配置Redis6
  8. java steam 排序_Java使用Steams VS TreeMap对地图进行排序
  9. ktm390蓝牙连接安卓_车机蓝牙连接常见问题说明
  10. R中统计假设检验总结
  11. matlab内建函数怎么不同颜色,matlab分段函数不同颜色绘图
  12. adb连接手机全过程(以oppo手机为例)(解决adb devices 找不到设备)
  13. ectouch java_ectouch: 包含 ECTouch_v2.7.2_SC_UTF8 ECshop_v3.6.0_UTF8_release ECShop_V4.0.0_UTF8
  14. thinkpad x270 加装内置4G模块实现移动上网的记录
  15. ps制作公章教程,沿着圆圈打字,斑驳效果
  16. 如何使用微软提供的TCHAR.H头文件?
  17. Minio过期分片上传文件清理引出的系统配置
  18. 网页打印问题-页面显示不全
  19. Windows 桌面应用开发入门
  20. CSS基础(P45-P65)

热门文章

  1. win10中运行LoadRunner:Initialization failed; communication error. Error (-81024): LR_VUG: The ‘QTWeb‘ t
  2. html+在ul中加边框,为元素添加边框,你有多少种好办法?
  3. 让View具有减速效果的动画——FlingAnimation
  4. 【转载】目前市场上主流的BI产品主要有哪些?
  5. java 读取zip文件_JAVA实现zip文件内容读取及解压
  6. 建筑企业“出租脚手架”究竟如何缴纳增值税
  7. LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。
  8. 【Games101】图形的基础变换 总结
  9. ios11对比android8.0,谁的设计更好?iOS11正式版多图详尽对比安卓8.0
  10. java程序员一般用什么笔记本_程序员对笔记本电脑有什么要求吗?推荐下哪些牌子笔记本性价比高?...