OpenCv基礎(C++)

1.圖像讀取與顯示

#include<opencv2/opencv.hpp>
using namespace cv;Mat src = imread("C:/Users/16385/Desktop/new/photo/1.jpg");//讀取圖像
Mat src = imread("C:/Users/16385/Desktop/new/photo/1.jpg",IMREAD_GRAYSCALE);
//將讀取的圖像轉為灰色imshow("輸入圖像", src);//展示圖像

2.色彩空間轉換

Mat gray, hsv;cvtColor(image, hsv, COLOR_BGR2HSV);//將image的RGB色彩空間轉換為hsv色彩空間
cvtColor(image, gray, COLOR_BGR2GRAY);imwrite("D:/hsv.png", hsv);//保存圖片到D盤
imwrite("D:/gray.png", gray);

hsv色彩空間??

inrange?檢查輸入圖像中的每個像素,如果像素值位于指定的范圍內,則在輸出圖像(或掩碼)中對應位置的像素被設置為白色(或者說是255),否則被設置為黑色(0)

void QuickDemo::inrange_demo(Mat& image)
{Mat hsv;cvtColor(image, hsv, COLOR_BGR2HSV);Mat mask;inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);//imshow("mask", mask);Mat redback=Mat::zeros(image.size(),image.type());redback = Scalar(40, 40, 200);bitwise_not(mask, mask);imshow("mask", mask);image.copyTo(redback, mask);//copyTO的行為//只在mask為白色的區域,將image的像素復制到redback。//黑色區域保持不變(即保留紅色背景)。imshow("roi區域提取", redback);
}

3.創建空白圖像

這種初始化通常用于:創建空白圖像,初始化臨時處理矩陣,準備存儲三通道數據(如彩色圖像)

	Mat m3 = Mat::zeros(Size(512, 512), CV_8UC3);//表示每個元素是 8 位無符號整數(0-255),并且每個像素有 3 個通道 8U C3m3 = Scalar(0, 0, 255);//設置圖像的色彩值std::cout << "width: " << m3.cols << "height: " << m3.rows << "channel: " << m3.channels() << std::endl;//std::cout << m3 << std::endl;imshow("圖像", m3);

?1,2,3可以看作是一個像素點

4.拷貝圖像

Mat m4;
m3.copyTo(m4);//深拷貝(再創建一份空間,存儲)Mat m4=m3.clone();//深拷貝Mat m4=m3;//淺拷貝(使用原來的空間,后續更改m4,m3也會更改)

?5.圖像的讀寫

//for循環讀寫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];}}}imshow("像素圖像",image);//指針遍歷,速度快for (int row = 0; row < h; row++){uchar* current = image.ptr<uchar>(row);//獲取當前行指針for (int col = 0; col < w; col++){if (dims == 1)//灰度圖像{int pv = *current;*current++ = 255 - pv;//先索引,指針再++}if (dims == 3)//彩色圖像{*current++ = 255 - *current;*current++ = 255 - *current;*current++ = 255 - *current;}}}

6.圖像像素的運算操作

	Mat dst = Mat::zeros(image.size(),image.type());Mat m = Mat::zeros(image.size(), image.type());m = Scalar(5, 5, 5);//運算后超過255,值會變成255,反之少于0,為0add(image, m, dst);subtract(image, m, dst);multiply(image, m, dst);divide(image, m, dst);imshow("運算圖像", dst);

7.滑塊控件動態改變圖像亮度

static void on_track(int b, void* userdata)
{Mat image = *((Mat*)userdata);//先將void*指針強制轉化為Mat*,再解引用得到image對象Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());m = Scalar(b, b, b);add(image, m, dst);imshow("亮度調整", dst);
}
void QuickDemo::tracking_bar_demo(Mat& image)//引用傳遞是淺拷貝
{namedWindow("亮度調整", WINDOW_AUTOSIZE);//創建窗口//src = image;int lightness = 50;int max_value = 100;createTrackbar("Value Bar:", "亮度調整", &lightness, max_value, on_track,(void*)(&image));//強制將&image轉換為void*指針on_track(50, &image);
}

8.鍵盤響應操作

void QuickDemo::key_demo(Mat& image)
{Mat dst = Mat::zeros(image.size(), image.type());while (true){int c = waitKey(0);if (c == 27) break;if (c == 49)//鍵盤按下了數字1{std::cout << "press the number 1" << std::endl;cvtColor(image, dst, COLOR_BGR2GRAY);}if (c == 50)//鍵盤按下了數字2{std::cout << "press the number 2" << std::endl;cvtColor(image, dst, COLOR_BGR2HSV);}if (c == 51)//鍵盤按下了數字3{std::cout << "press the number 3" << std::endl;dst = Scalar(50, 50, 50);add(image, dst, dst);}imshow("圖像", dst);}
}

9.顏色表操作colormap,applyColorMap()

void QuickDemo::color_style_demo(Mat& image)
{int colormap[]{COLORMAP_AUTUMN,COLORMAP_BONE,COLORMAP_JET,COLORMAP_WINTER,COLORMAP_RAINBOW,COLORMAP_OCEAN,COLORMAP_SUMMER,COLORMAP_SPRING,COLORMAP_COOL,COLORMAP_HSV,COLORMAP_PINK,COLORMAP_HOT,COLORMAP_PARULA,COLORMAP_MAGMA,COLORMAP_INFERNO,COLORMAP_PLASMA,COLORMAP_VIRIDIS,COLORMAP_CIVIDIS,COLORMAP_TWILIGHT,COLORMAP_TWILIGHT_SHIFTED,COLORMAP_TURBO,COLORMAP_DEEPGREEN};Mat dst;int index = 0;while (true){int c = waitKey(1000);if (c == 27) break;applyColorMap(image, dst, colormap[index]);index=(++index)%22;imshow("hh", dst);}
}

10.圖像像素運算(bitwise)

void QuickDemo::bitwise_demo(Mat& image)
{Mat m1 = Mat::zeros(Size(255, 255), CV_8UC3);Mat m2 = Mat::zeros(Size(255, 255), CV_8UC3);rectangle(m1, Rect(100, 100, 80, 80), Scalar(0, 255, 255),-1);rectangle(m2, Rect(150, 150, 80, 80), Scalar(255, 255, 0),-1);imshow("m1", m1);imshow("m2", m2);Mat dst=m1^m2;//等價于bitwise_xor(m1, m2, dst);//bitwise_or(m1, m2, dst);//bitwise_and(m1, m2, dst);//bitwise_not(image, dst);imshow("hh", dst);}

11.通道分離、合并、混合

void QuickDemo::channels_demo(Mat& image)
{std::vector<Mat> mv;split(image, mv);//分離通道//imshow("blue", mv[0]);//opencv設置單通道只顯示灰度圖(黑白)//imshow("green", mv[1]);//imshow("red", mv[2]);Mat dst;mv[1] = 0;//只顯示兩個通道的顏色merge(mv, dst);imshow("merge", dst);int from_to[] = { 0,2,1,1,2,0 };/*  src顏色通道0復制到dst顏色通道2src顏色通道1復制到dst顏色通道1src顏色通道2復制到dst顏色通道0*/mixChannels(image, dst, from_to, 3);//通道混合imshow("mix", dst);
}

12.圖像像素最大值,最小值,平均值,標準差(minMaxLoc,meanStdDev)

void QuickDemo::pixel_statistic_demo(Mat& image)
{double minv, maxv;Point minLoc, maxLoc;std::vector<Mat> mv;split(image, mv);for (int i = 0; i < 3; i++){minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc);//這里需要使用mv的單通道std::cout << "i:" << i << "minv= " << minv << "maxv= " << maxv << std::endl;}Mat mean, stddev;meanStdDev(image, mean, stddev);std::cout << "mean: " << mean << std::endl;std::cout << "stddev: " << stddev << std::endl;
}

13.圖像幾何形狀繪制

void QuickDemo::drawing_demo(Mat& image)
{rectangle(image, Rect(100, 100, 250, 300), Scalar(0, 0, 255),1, LINE_AA,0);circle(image, Point(100, 100), 50, Scalar(255, 0, 0),-1);line(image, Point(100, 100), Point(200, 200), Scalar(0, 255, 0),5,8,0);ellipse(image, RotatedRect(Point(200, 200), Size(50, 100), 90),Scalar(0,0,255),1, LINE_AA);Mat dst;dst = Mat::zeros(image.size(), image.type());dst = Scalar(0, 255, 0);addWeighted(image, 0.7, dst, 0.3,50,dst);//addWeighted() 函數用于實現兩個圖像的加權融合(線性混合)imshow("draw", dst);
}

14.隨機數

// 方法1:使用默認種子(系統時間)
cv::RNG rng;  // 等價于 cv::RNG rng(time(NULL));// 方法2:指定種子(生成可重復的隨機序列)
cv::RNG rng(12345);  // 固定種子,每次運行生成相同的隨機數
//指定種子后,假如第一次隨機的是生成的隨機數序列:85 22 91 14 67 //重置種子后再次生成:85 22 91 14 67 
void QuickDemo::random_drawing()
{Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);RNG rng(12345);//創建對象,12345是固定種子while (true){int c = waitKey(100);if (c == 27) break;int x1 = rng.uniform(0, canvas.cols);int y1 = rng.uniform(0, canvas.rows);int x2 = rng.uniform(0, canvas.cols);int y2 = rng.uniform(0, canvas.rows);//canvas = Scalar(0, 0, 0);可以每次使窗口變為黑色,每次窗口只顯示一條線line(canvas, Point(x1, y1), Point(x2, y2), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));imshow("hh", canvas);}
}

15.多邊形填充與繪制

polylines();//繪制折線或輪廓
fillPoly();//填充多邊形
drawContours();//繪制 / 填充輪廓
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);std::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(255, 0, 0), 3, LINE_AA, 0);fillPoly(canvas, pts, Scalar(0, 255, 0));std::vector<std::vector<Point>> contours;contours.push_back(pts);drawContours(canvas, contours, -1, Scalar(0, 255, 0),-1);imshow("hh", canvas);
}

16.鼠標操作與響應setMouseCallback

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;std::cout << sp << std::endl;}else if (event == EVENT_LBUTTONUP){ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){Rect box(sp.x, sp.y, dx,dy);temp.copyTo(image);imshow("ROI", image(box));//從image提取出box區域rectangle(image, box, Scalar(0, 255, 0));imshow("鼠標繪制", image);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 = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){Rect box(sp.x, sp.y, dx, dy);temp.copyTo(image);//覆蓋原來的圖像rectangle(image, box, Scalar(0, 255, 0));imshow("鼠標繪制", image);}}}
}void QuickDemo::mouse_drawing_demo(Mat& image)
{namedWindow("鼠標繪制", WINDOW_AUTOSIZE);setMouseCallback("鼠標繪制", on_draw, (void*)(&image));imshow("鼠標繪制", image);temp = image.clone();
}

17.圖像像素類型轉換與歸一化(normalize)

void QuickDemo::normal_demo(Mat& image)
{Mat dst;image.convertTo(image, CV_32F);//將圖像轉化為32位的浮點數
//這一步是必要的,因為歸一化到 [0,1] 范圍需要浮點數支持normalize(image, dst, 1, 0, NORM_MINMAX);imshow("hh", dst);
//OpenCV 的imshow函數在顯示浮點數圖像時,默認將 [0,1] 范圍映射到 [0,255] 顯示
}

18.圖像縮放與插值(resize)

resize

void QuickDemo::resize_demo(Mat& image)
{Mat dst1,dst2;int w = image.rows;int h = image.cols;resize(image, dst1, Size(w / 2, h / 2), 0, 0,INTER_LINEAR);imshow("hh", dst1);resize(image, dst2, Size(w * 1.2, h * 1.2), 0, 0, INTER_LINEAR);imshow("hh1", dst2);
}

19.圖像翻轉flip

void QuickDemo::filp_demo(Mat& image)
{Mat dst1,dst2,dst3;flip(image, dst1, 0);//0:沿 X 軸(水平)翻轉。flip(image, dst2, 1);//	正數(如 1):沿 Y 軸(垂直)翻轉。flip(image, dst3, -1);//負數(如 - 1):同時沿 X 軸和 Y 軸翻轉。imshow("hh1", dst1);imshow("hh2", dst2);imshow("hh3", dst3);
}

20.圖像旋轉

Mat getRotationMatrix2D(Point2f center, double angle, double scale);
  • center:旋轉中心點(圖像坐標系中的坐標,例如Point2f(x, y))。
  • angle:旋轉角度(單位:度),正值表示逆時針旋轉,負值表示順時針旋轉。
  • scale:縮放因子(例如1.0表示保持原大小,0.5表示縮小一半)。
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar());
  • src:輸入圖像。
  • dst:輸出圖像,大小由?dsize?指定,類型與輸入圖像相同。
  • M:2×3 的變換矩陣(通常由?getRotationMatrix2D?或自定義方法生成)。
[ cosθ  -sinθ  0 ]//M旋轉時的矩陣
[ sinθ   cosθ  0 ]
  • dsize:輸出圖像的大小(Size(width, height))。
  • flags:插值方法,常用選項:
    • INTER_LINEAR:雙線性插值(默認)。
    • INTER_NEAREST:最近鄰插值。
    • INTER_CUBIC:雙三次插值(質量更高,但速度較慢)。
  • borderMode:邊界填充模式,常用?BORDER_CONSTANT(用常量填充)。
  • borderValue:當?borderMode?為?BORDER_CONSTANT?時的填充值(默認黑色)。

旋轉后的寬和高?的計算

void QuickDemo::rotato_demo(Mat& image)
{Mat M, dst;int w = image.cols;int h = image.rows;M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1);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);//x軸偏移量M.at<double>(1, 2) += (nh / 2 - h / 2);warpAffine(image, dst, M, Size(nw, nh));imshow("hh", dst);
}

?21.視頻文件攝像頭的使用(VideoCapture)

void QuickDemo::vedio_demo()
{VideoCapture v(0);//讀取的使本地攝像頭Mat frame;while (true){v.read(frame);if (frame.empty()) break;imshow("hh", frame);if (waitKey(1) == 27) break;}v.release();
}void QuickDemo::vedio_demo()
{VideoCapture v("C:/Users/16385/Desktop/new/photo/2.mp4");int frame_width = v.get(CAP_PROP_FRAME_WIDTH);//獲得v的相關信息int frame_height = v.get(CAP_PROP_FRAME_HEIGHT);int count = v.get(CAP_PROP_FRAME_COUNT);double fps = v.get(CAP_PROP_FPS);std::cout << "frame width:" << frame_width << std::endl;std::cout << "frame height:" << frame_height << std::endl;std::cout << "FPS:" << fps << std::endl;std::cout << "Number of Frames:" << count << std::endl;VideoWriter writer("D:/test.mp4", v.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);//保存視頻Mat frame;while (true){v.read(frame);if (frame.empty()) break;imshow("hh", frame);writer.write(frame);if (waitKey(1) == 27) break;}v.release();writer.release();
}

22.圖像直方圖calcHist

calcHist

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912680.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912680.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL非阻塞創建索引的方法

文章目錄 1. Online DDL (MySQL 5.6)2. pt-online-schema-change 工具3. gh-ost 工具4. 對于MySQL 8.0注意事項 在MySQL中創建大型表索引時&#xff0c;傳統方式會阻塞表的寫操作&#xff0c;影響生產環境使用。以下是幾種非阻塞創建索引的方法&#xff1a; 1. Online DDL (My…

數字雨動畫背景

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>數字雨動畫背景</title><style>* {m…

分布式鎖的概念與應用場景

一、分布式鎖的核心概念 分布式鎖是一種在分布式系統環境下&#xff0c;用于保證多個進程/節點對共享資源實現互斥訪問的機制。其本質是通過某種中間件&#xff08;如Redis、ZooKeeper等&#xff09;實現跨節點的鎖控制&#xff0c;確保在分布式環境中&#xff0c;同一時刻只有…

js代碼09

題目 好的&#xff0c;我們繼續。 在上一個練習中&#xff0c;我們深入探討了 this 的復雜性。你會發現&#xff0c;ES6 引入的 class 語法在很大程度上就是為了簡化 this 的使用&#xff0c;并為 JavaScript 提供一個更清晰、更熟悉的面向對象編程&#xff08;OOP&#xff0…

基于Airtest的App數據爬取實戰:突破傳統爬蟲的邊界

引言:App數據爬取的技術困境 在當今移動優先的時代,App已成為企業核心數據載體,然而??傳統爬蟲技術??在App數據獲取上面臨三大難題: ??協議層屏障??:加密HTTPS、SSL Pinning等技術阻斷中間人攻擊??渲染層障礙??:React Native、Flutter等跨平臺框架使DOM解析…

【LeetCode 熱題 100】560. 和為 K 的子數組——(解法一)前綴和+暴力

Problem: 560. 和為 K 的子數組 題目&#xff1a;給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。子數組是數組中元素的連續非空序列。 【LeetCode 熱題 100】560. 和為 K 的子數組——&#xff08;解法二&#xff09;前綴和…

android車載開發之HVAC

目前主要在做車載hvac的開發&#xff0c;主要的一些功能主要是hvac&#xff0c;座椅&#xff0c;香氛&#xff0c;設置等的一些模塊&#xff0c;具體模塊下&#xff0c;比如 1.空調 ac&#xff0c;智能模式&#xff08;極速降溫&#xff0c;極速采暖&#xff0c;智能除味&…

深度學習 Diffusers 庫(自留)

&#xff08;本文將圍繞 安裝Diffusers庫及其依賴、理解Diffusers核心概念&#xff1a;Pipeline, Model, Scheduler 、使用預訓練模型進行推理&#xff08;文生圖、圖生圖等&#xff09; 、 自定義模型和調度器 、訓練自己的擴散模型&#xff08;可選&#xff0c;需要大量資源&…

【VPC技術】基礎理論篇

文章目錄 概述相關基礎核心知識軟件定義網絡SDNOverlay 技術 安全組概述 參考博客 &#x1f60a;點此到文末驚喜?? 概述 相關基礎 基本概念 虛擬私有云VPC&#xff1a;是一個隔離的網絡環境&#xff0c;每個VPC擁有專屬的IP地址范圍&#xff08;CIDR&#xff09;、路由表、…

在 RK3588 Ubuntu 上編譯 eglinfo:全流程實戰 + 常見報錯修復

dv1/eglinfo 是一個開源的 EGL 信息檢測工具&#xff0c;廣泛用于 OpenGL ES 圖形棧調試、驅動驗證和嵌入式平臺圖形支持排查。在 Rockchip RK3588 上編譯該工具可以協助我們確認 EGL DRM 是否配置正確&#xff0c;尤其在無窗口系統&#xff08;如 eglfs、framebuffer&#xf…

開源推薦:基于前后端分離架構的WMS倉儲管理系統

開源推薦&#xff1a;基于前后端分離架構的WMS倉儲管理系統 &#x1f525; 在線演示地址&#xff1a;https://tob.toolxq.com/wms/wms.html 點擊上方鏈接可直接體驗系統功能和界面&#xff0c;無需安裝部署 前言 在企業數字化轉型的浪潮中&#xff0c;倉儲管理系統&#xff08…

Redis中List類型常見的操作命令有哪些?

Redis中List類型是一個字符串列表&#xff0c;這里是一些常見的命令&#xff1a; 1&#xff09;lpush:將一個或多個值插入到列表頭部。列表不存在&#xff0c;一個新的列表會被創建。 2&#xff09;rpush:將一個或多個值插入到列表尾部。 3&#xff09;lpop:移除并返回列表頭…

mac重復文件清理,攝影師同款清理方案

攝影師小林盯著屏幕上的警告&#xff1a;“存儲空間不足”&#xff0c;離截稿只剩3小時。她的MacBook如同塞滿回憶的閣樓&#xff0c;128GB的“其他”空間神秘消失。翻看照片庫時&#xff0c;她驚訝地發現——同一組西藏雪山照片竟有十幾個副本&#xff01;這是mac重復文件問題…

lua腳本為什么能保證原子性

Redis 處理客戶端請求是基于單線程模型的&#xff08; Redis 6.0 開始引入了多線程處理網絡 IO&#xff0c;但命令執行仍然是單線程的&#xff09;。這意味著&#xff0c;在任意時刻 Redis 只會執行一個命令或腳本。這種單線程特性確保了當 Redis 在執行一個 Lua 腳本時&#x…

爬蟲詳解:Aipy打造自動抓取代理工具

一、爬蟲的本質與核心功能 爬蟲是一種通過編寫程序自動抓取互聯網公開數據的技術工具&#xff0c;其核心流程包括&#xff1a; 模擬瀏覽器行為&#xff1a;發送 HTTP 請求訪問目標網頁解析頁面結構&#xff1a;提取 HTML/XML 中的關鍵信息&#xff08;如文本、鏈接、圖片&…

Leetcode百題斬-棧

終于來到了棧專題&#xff0c;想想之前來阿里的時候就是面試了一道棧最終通過了終面&#xff0c;也是十分懷念了。 739. Daily Temperatures[Medium] 思路&#xff1a;這就是最典型的單調棧問題了。從后向前維護下一個更大值或者下一個更大值的位置。 可以看一下當年面阿里時…

PIXHAWK(ardupilot4.52)NMEA的解析bug

最近在測試過程中發現在橢球高為負的地方&#xff0c;地面站讀取GPS_RAW_INT (24)消息中的alt高度竟然是正值。而消息中定義的alt并不是一個unsigned數據&#xff0c;理論上是帶有正負符號的。 查看gga的原始信息&#xff1a; $GPGGA,063718.40,3714.8533856,N,11845.9411766,…

Linux容器講解以及對應軟件使用

一、容器基礎知識講解 1.1 微服務的部署策略 部署單體應用意味著運行大型應用的多個相同副本&#xff0c;通常提供若干臺&#xff08;N&#xff09;服務器&#xff08;物理機或虛擬 機&#xff09;&#xff0c;在每臺服務器上運行若干個&#xff08;M&#xff09;應用實例。部…

企業級應用技術-ELK日志分析系統

目錄 #1.1ELK平臺介紹 1.1.1ELK概述 1.1.2Elasticsearch 1.1.3Logstash 1.1.4Kibana #2.1部署ES群集 2.1.1基本配置 2.1.2安裝Elasticsearch 2.1.3安裝Logstash 2.1.4Filebeat 2.1.5安裝Kibana 1.1ELK平臺介紹 1.1.1ELK概述 ELK 是三個開源工具的縮寫&#xff0c;分別是Elas…

Shiro漏洞復現

Shiro簡介 Apache Shiro是一種功能強大且易于使用的Java安全框架&#xff0c;它執行身份驗證、授權、 加密和會話管理&#xff0c;可用于保護任何應用程序的安全。 Shiro提供了應用程序安全性API來執行以下方面&#xff1a; 1.身份驗證&#xff1a;證明用戶身份&#xff0c;通…