C++ opencv 學習

文章目錄

  • 1、創建窗口
  • 2、讀取圖片
  • 3、視頻采集
  • 4、Mat的使用
  • 5、異或操作
  • 6、通道分離,通道合并
  • 7、色彩空間轉換
  • 8、最大值、最小值
  • 9、繪制圖像
  • 10、多邊形繪制
  • 11、隨機數
  • 12、鼠標實時繪制矩形
  • 13、歸一化
  • 14、resize操作
  • 15、旋轉翻轉
  • 16、視頻操作
  • 17、模糊操作
  • 18、高斯模糊操作

1、創建窗口

c++寫法:

void test2()
{Mat img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");cout<<img.depth()<<" "<<img.channels()<<endl;namedWindow("new",cv::WINDOW_AUTOSIZE);imshow("new",img);waitKey(0);destroyAllWindows();
}

python寫法:

def test():cv2.namedWindow('new', cv2.WINDOW_NORMAL)cv2.imshow('new', 0)key = cv2.waitKey(0)if key & 0xFF  == ord('q'):cv2.destroyAllWindows()

2、讀取圖片

c++寫法,操作圖像,將圖像轉換為hsv然后調整亮度值,轉換會BGR格式顯示

void test2()
{Mat img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");cout<<img.depth()<<" "<<img.channels()<<endl;namedWindow("new",cv::WINDOW_AUTOSIZE);imshow("new",img);waitKey(0);Mat gray,hsv;cvtColor(img,gray,cv::COLOR_BGR2GRAY);imshow("new",gray);waitKey(0);cvtColor(img,hsv,cv::COLOR_BGR2HSV);imshow("new",hsv);waitKey(0);Mat channels[3];// 將HSV圖像分離為三個單獨的通道,這將把HSV圖像的三個通道分別存儲在channels數組的不同元素中split(hsv,channels);int bright = 50;channels[2] += bright;// 將亮度通道的像素值限制在0到255之間,大于255截斷為255threshold(channels[2],channels[2],255,255,cv::THRESH_TRUNC);// 將修改后的通道合并為單個圖像cv::merge(channels, 3, hsv);Mat outputImage;cv::cvtColor(hsv, outputImage, cv::COLOR_HSV2BGR);imshow("new",outputImage);waitKey(0);destroyAllWindows();
}
@param filename Name of file to be loaded.
@param flags Flag that can take values of cv::ImreadModesCV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );flags標識符介紹:
IMREAD_GRAYSCALE = 0, 灰度圖
IMREAD_COLOR = 1,原本是什么顏色就顯示什么顏色
def test2():cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)img = cv2.imread(img_name, 1)cv2.imshow('new', img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite('1.png',img)

3、視頻采集

def test3():# cv2.namedWindow('new', cv2.WINDOW_AUTOSIZE)# 獲取視頻設置 cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()cv2.imshow('video', frame)key = cv2.waitKey(10)if (key & 0xFF) == ord('q'):breakcap.release()cv2.destroyAllWindows()

錄制視頻

def test4():fourcc = cv2.VideoWriter_fourcc(*'MJPG')vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1920, 1080))cap = cv2.VideoCapture(0)# 判斷攝像頭是否打開狀態while cap.isOpened():ret, frame = cap.read()if ret == True:cv2.imshow('video', frame)# 寫數據到多媒體文件vw.write(frame)key = cv2.waitKey(10)if (key & 0xFF) == ord('q'):breakelse:breakcap.release()cv2.release()cv2.destroyAllWindows()

在這里插入圖片描述
在這里插入圖片描述

import cv2# 色彩空間
# hsv:色相、飽和度、明亮度
# yuv:4:2:0 4:2:2 4:4:4def callback():passdef test7():cv2.namedWindow('color',cv2.WINDOW_NORMAL)img = cv2.imread('./1.png')colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BRGA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV_FULLL,cv2.COLOR_BGR2YUV]cv2.createTrackbar('curcolor','color',0,len(colorspaces),callback)while True:index = cv2.getTrackbarPos('curcolor','color')cvt_img = cv2.cvtColor(img,colorspaces[index])cv2.imshow('color',img)key = cv2.waitKey(10)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()if __name__ == '__main__':test7()

4、Mat的使用

深拷貝和淺拷貝

void test3()
{Mat img,m1,m2;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");// 克隆,深拷貝m1 = img.clone();img.copyTo(m2);// 創建空白圖像Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);// 創建全部為1的通道,如果創建的是3通道,則只有每個元素的第一個通道為1Mat m4 = Mat::ones(Size(8,8),CV_8UC3);cout<<m3.cols<<m3.rows<<m3.channels()<<endl;// 3通道時候:每個元素的第一個通道為1m4 = 127;// 給3個通道都復值m4 = Scalar(127,127,127);
}

像素值操作:
1、根據下標操作
2、根據指針操作

void test4()
{// 像素遍歷操作namedWindow("new",WINDOW_NORMAL);Mat img,gray;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");for(int i=0;i<img.rows;i++){for(int j=0;j<img.cols;j++){Vec3b bgr = img.at<Vec3b>(i,j);img.at<Vec3b>(i,j)[0] = 255 - bgr[0];img.at<Vec3b>(i,j)[1] = 255 - bgr[1];img.at<Vec3b>(i,j)[2] = 255 - bgr[2];}}imshow("new",img);waitKey(0);cvtColor(img,gray,cv::COLOR_BGR2GRAY);for(int i=0;i<gray.rows;i++){for(int j=0;j<gray.cols;j++){int pt = img.at<uchar>(i,j);img.at<uchar>(i,j) = 255 - pt;}}imshow("new",gray);waitKey(0);// 基于指針訪問 速度更快for(int i=0;i<img.rows;i++){uchar *current_row = img.ptr<uchar>(i);for(int j=0;j<img.cols;j++){if(img.channels() == 1){int pt = *current_row;*current_row++ = 255 - pt;}else if(img.channels() == 3){*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}destroyAllWindows();
}

像素值的加減乘除

void test5()
{// 像素操作namedWindow("new",WINDOW_NORMAL);Mat img,gray;img = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");Mat m = Mat::zeros(img.size(),img.type());m = Scalar(2,2,2);Mat dst;// 乘法運算,超過255的時候會截斷multiply(img,m,dst);// 加法操作add(img,m,dst);// 減法subtract(img,m,dst);// 除法divide(img,m,dst);// saturate_cast會做一個范圍判定,是否在uchar范圍內// saturate_cast<uchar>(p1,p2);imshow("new",dst);waitKey(0);destroyAllWindows();
}

GUI操作

void on_trac(int val,void *userdata)
{Mat *data = (Mat*)userdata;Mat m = Mat::zeros(data->size(),data->type());m = Scalar(val,val,val);Mat dst;add(*data,m,dst);imshow("new",dst);
}void test6()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");int maxValue = 100;int light = 50;cout<<src.type()<<endl;createTrackbar("Value Bar","new",&light,maxValue,on_trac,(void *)(&src));on_trac(50,&src);
}

addWeighted函數解釋

dst = src1 * alpha + src2 * beta + gamma

5、異或操作

// 異或操作
void test7()
{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(255,255,0),-1,LINE_8,0);rectangle(m2,Rect(130,130,80,80),Scalar(255,0,255),-1,LINE_8,0);imshow("new",m1);waitKey(0);imshow("new",m2);waitKey(0);Mat dst;// 按位與(都為真就為真)bitwise_and(m1,m2,dst);imshow("new",dst);waitKey(0);// 按位或(一個為真就為真)bitwise_or(m1,m2,dst);imshow("new",dst);waitKey(0);// 按位取反bitwise_not(m1,dst);imshow("new",dst);waitKey(0);// 異或(不同為真,相同為假)bitwise_xor(m1,m2,dst);imshow("new",dst);waitKey(0);destroyAllWindows();
}

6、通道分離,通道合并

// 通道分離,通道合并
void test8()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");imshow("new",src);waitKey(0);vector<Mat> mv;split(src,mv);imshow("new",mv[0]);waitKey(0);imshow("new",mv[1]);waitKey(0);imshow("new",mv[2]);waitKey(0);// 將藍色和綠色通道全部置0,只保留紅色通道,然后合并mv[0] = 0;mv[1] = 0;Mat dst;merge(mv,dst);imshow("new",dst);waitKey(0);// 通道融合// 第三個參數,0通道到2通道,1通道到1通道,2通道到0通道int from_to[] = {0,2,1,1,2,0};mixChannels(&src,1,&dst,1,from_to,3);imshow("new",dst);waitKey(0);
}

7、色彩空間轉換

// 色彩空間轉換
void test9()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg");Mat dst,mask;cvtColor(src,dst,COLOR_BGR2HSV);// 出來一張2值化的圖像,綠色背景是白色,人物是黑色inRange(dst,Scalar(35,43,46),Scalar(77,255,255),mask);Mat redback = Mat::zeros(src.size(),src.type());redback = Scalar(40,40,200);// 取放之后人物酒變成白色了,背景是黑色的bitwise_not(mask,mask);// 只拷貝不為0的區域,為0的區域不拷貝src.copyTo(redback,mask);imshow("new",redback);waitKey(0);
}

8、最大值、最小值

// 最大值、最小值
// 均值,方差
// 方差衡量數據集中值的離散程度,數據集中差異較小時,標準方差較小,差異較大時,方差較大(攜帶有效信息就越多)
// 1、計算出均值
// 2、計算每個元素與平均值的差的平方
// 3、計算平方差的平均值,得到的平方差相加,然后除以數據點的總數
// 4、取平方根:將平均平方差的值進行平方根運算,得到標準方差。

void test10()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg",cv::IMREAD_GRAYSCALE);double minv,maxv;Point minLoc,maxLoc;minMaxLoc(src,&minv,&maxv,&minLoc,&maxLoc,Mat());cout<<"minv:"<<minv<<" maxv:"<<maxv<<" minLoc:"<<minLoc<<" maxLoc:"<<maxLoc<<endl;Mat mean,stddev;meanStdDev(src,mean,stddev);cout<<mean<<" "<<stddev<<endl;
}

9、繪制圖像

void test11()
{namedWindow("new",WINDOW_AUTOSIZE);Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/green.jpg",cv::IMREAD_COLOR);// 繪制矩形Mat bg = Mat::zeros(src.size(),src.type());Mat dst;Rect rect(100,100,200,200);rectangle(bg,rect,Scalar(20,20,255),2,LINE_8,0);// 繪制圓,圓心坐標Point,15是半徑circle(src,Point(350,400),150,Scalar(255,0,0),2,LINE_8,0);// 圖像融合addWeighted(src,0.7,bg,0.3,0,dst);// 繪制線 兩個點的位置line(bg,Point(100,100),Point(350,400),Scalar(0,255,0),2,LINE_8,0);// 繪制橢圓RotatedRect rrt;rrt.center = Point(200,200);rrt.size = Size(100,200);rrt.angle = 0;ellipse(src,rrt,Scalar(0,255,255),2,8);imshow("new",dst);waitKey(0);
}

10、多邊形繪制

// 多邊形繪制
void test13()
{Mat bg = Mat::zeros(Size(512,512),CV_8UC3);Point p1(100,200);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(bg,pts, true,Scalar(0,0,255),2,LINE_8,0);// 填充多邊形
//    fillPoly()imshow("new",bg);waitKey(0);
}

11、隨機數

void test12()
{Mat bg = Mat::zeros(Size(512,512),CV_8UC3);int w = bg.cols;int h = bg.rows;// 隨機數RNG rng(12345);while (true){int c = waitKey(10);if(c == 27) break;int x1 = rng.uniform(0,w);int y1 = rng.uniform(0,h);int x2 = rng.uniform(0,w);int y2 = rng.uniform(0,h);// 每次畫之前清理一下bg = Scalar(0,0,0);line(bg,Point(x1,y1),Point(x2,y2),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,LINE_AA,0);imshow("new",bg);}
}

12、鼠標實時繪制矩形

Point sp(-1, -1);
Point ed(-1, -1);
Mat temp;static void on_draw(int event, int x, int y, int flags, void* userdata)
{Mat img = *((Mat*)userdata);if (event == EVENT_LBUTTONDOWN) {sp.x = x;sp.y = y;cout << "sp.x:" << sp.x << " sp.y:" << sp.y << endl;}else if (event == EVENT_LBUTTONUP) {ed.x = x;ed.y = y;cout << "ed.x:" << ed.x << " ed.y:" << ed.y << endl;int x1 = x - sp.x;int y1 = y - sp.y;if (x1 > 0 && y1 > 0) {Rect rect(sp.x, sp.y, x1, y1);temp.copyTo(img);imshow("ROI區域", img(rect));rectangle(img,rect,Scalar(0,0,255),2,8,0);imshow("new", img);sp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE) {if (sp.x > 0 && sp.y > 0) {ed.x = x;ed.y = y;int dx = ed.x - sp.x;int dy = ed.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);temp.copyTo(img);rectangle(img, box, Scalar(0, 0, 255), 2, 8, 0);imshow("new", img);}}}
}void test14()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);setMouseCallback("new", on_draw, (void*)&src);src.copyTo(temp);imshow("new", src);waitKey(0);destroyAllWindows();
}

13、歸一化

// 1、MINMAX
void test15()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat img,img2;cout<<src.type()<<endl;src.convertTo(src,CV_32FC3);cout<<src.type()<<endl;normalize(src,img,1.0,0,NORM_MINMAX);// imshow想顯示浮點數據,必須歸一化0-1之間imshow("new",img);normalize(img,img2,255.0,0,NORM_MINMAX);img2.convertTo(img2,CV_8UC3);imshow("new1",img2);waitKey(0);
}

14、resize操作

// resize
void test16()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat zoomin,zoomout;int w = src.cols;int h = src.rows;resize(src,zoomin,Size(w/2,h/2),0,0,INTER_LINEAR);resize(src,zoomout,Size(w*1.5,h*1.5),0,0,INTER_LINEAR);imshow("1",src);imshow("2",zoomin);imshow("3",zoomout);waitKey(0);
}

15、旋轉翻轉

void test17()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");
//    namedWindow("new", WINDOW_AUTOSIZE);Mat dst,left,m1,m3;flip(src,dst,0);flip(src,left,1);flip(src,m1,-1);imshow("上下翻轉",dst);imshow("左右翻轉",left);imshow("180度旋轉",m1);waitKey(0);// 圖像旋轉Mat d,M;int w = src.cols;int h = src.rows;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);warpAffine(src,d,M,Size(nw,nh),INTER_LINEAR,0,Scalar(0,0,255));imshow("new",d);waitKey(0);
}

16、視頻操作


void test18()
{VideoCapture cap(0);Mat fram;while(true){cap.read(fram);if(fram.empty()){break;}flip(fram,fram,1);imshow("new",fram);int n = waitKey(10);if(n == 27){break;}}cap.release();
}

17、模糊操作

// 圖像卷積模糊操作
void test19()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat dst;blur(src,dst,Size(3,3),Point(-1,-1));imshow("new",dst);waitKey(0);
}

18、高斯模糊操作

// 高斯雙邊模糊
void test21()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Mat dst;bilateralFilter(src,dst,0,100,10);imshow("new",dst);waitKey(0);
}// 高斯模糊
void test20()
{Mat src = imread("/Users/zhulei/CLionProjects/opencv_test/1.jpg");namedWindow("new", WINDOW_AUTOSIZE);Rect rect(100,100,500,500);Mat roi = src(rect);GaussianBlur(roi,roi,Size(0,0),15);roi.copyTo(src(rect));imshow("new",src);waitKey(0);
}

在這里插入圖片描述

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

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

相關文章

SpringBoot整合MyBatis實現增刪改查

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人???? ??個人主頁:Leo的博客 ??當前專欄: 循序漸進學SpringBoot ?特色專欄: MySQL學習 ??本文內容: SpringBoot整合MyBatis實現增刪改查 ??個人知識庫: Leo知識庫,歡迎大家訪…

mysql之 case when

1 簡單 case 函數&#xff0c;IF函數 格式&#xff1a; CASE input_expression WHEN when_expression THENresult_expression [...n ] [ ELSEelse_result_expression ENDIF(條件,True結果,False結果)2 條件表達式 可嵌套多層&#xff0c;類似于 if … else if … else … end…

Java進階-IO(1)

進入java IO部分的學習&#xff0c;首先學習IO基礎&#xff0c;內容如下。需要了解流的概念、分類還有其他一些如集合與文件的轉換&#xff0c;字符編碼問題等&#xff0c;這次先學到字節流的讀寫數據&#xff0c;剩余下次學完。 一、IO基礎 1、背景 1.1 數據存儲問題 變量…

代碼隨想錄day11(1)字符串:反轉字符串中的單詞 (leetcode151)

題目要求&#xff1a;給定一個字符串&#xff0c;將其中單詞順序反轉&#xff0c;且每個單詞之間有且僅有一個空格。 思路&#xff1a;因為本題沒有限制空間復雜度&#xff0c;所以首先想到的是用split直接分割單詞&#xff0c;然后將單詞倒敘相加。 但如果想讓空間復雜度為O…

芯來科技發布最新NI系列內核,NI900矢量寬度可達512/1024位

參考&#xff1a;芯來科技發布最新NI系列內核&#xff0c;NI900矢量寬度可達512/1024位 (qq.com) 本土RISC-V CPU IP領軍企業——芯來科技正式發布首款針對人工智能應用的專用處理器產品線Nuclei Intelligence(NI)系列&#xff0c;以及NI系列的第一款AI專用RISC-V處理器CPU IP…

反向迭代器

反向迭代器 以list為例,我們完全可以再添加一個__list_reverse_iterator結構體,只需要修改和–的邏輯 template <class T, class Ref, class Ptr> struct __list_reverse_iterator {...self& operator(){_node _node->_prev;return *this;}self operator(int){…

Android 14.0 Launcher3定制化之桌面分頁橫線改成圓點顯示功能實現

1.前言 在14.0的系統rom產品定制化開發中&#xff0c;在進行launcher3的定制化中&#xff0c;在雙層改為單層的開發中&#xff0c;在原生的分頁 是橫線&#xff0c;而為了美觀就采用了系統原來的另外一種分頁方式&#xff0c;就是圓點比較美觀&#xff0c;接下來就來分析下相關…

網絡爬蟲部分應掌握的重要知識點

目錄 一、預備知識1、Web基本工作原理2、網絡爬蟲的Robots協議 二、爬取網頁1、請求服務器并獲取網頁2、查看服務器端響應的狀態碼3、輸出網頁內容 三、使用BeautifulSoup定位網頁元素1、首先需要導入BeautifulSoup庫2、使用find/find_all函數查找所需的標簽元素 四、獲取元素的…

基于springboot+vue的健身房管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

●139.單詞拆分 ● 關于多重背包,你該了解這些! ●背包問題總結篇!

●139.單詞拆分 物品&#xff1a;wordDict里面的單詞&#xff1b;背包容量&#xff1a;s.size()。 1.dp[j]含義。dp[j]true表示字符串前j個可以拆分成字典中的單詞。dp[s.size()] 就是最后的結果&#xff0c;整個字符串能&#xff08;true&#xff09;不能&#xff08;false…

Docker 創建容器并指定時區

目錄 1. 通過環境變量設置時區&#xff08;推薦&#xff09;2. 掛載宿主機的時區文件到容器中3. 總結 要在 Docker 容器中指定時區&#xff0c;可以通過兩種方式來實現&#xff1a; 1. 通過環境變量設置時區&#xff08;推薦&#xff09; 在 Docker 運行時&#xff0c;可以通…

NumPy數據處理詳解的筆記1

NumPy數據處理詳解的筆記1 第1章NumPy基礎 NumPy是用于處理多維數組的數值運算庫&#xff0c;不僅可用于 機器學習&#xff0c;還可以用于圖像處理&#xff0c;語言處理等任務。 1.1 NumPy的基礎與安裝方法 1.1.1 NumPy入門 NumPy是Python中進行科學計算所必備的基礎軟件庫…

CentOS安裝Docker(黑馬學習筆記)

Docker 分為 CE 和 EE 兩大版本。CE 即社區版&#xff08;免費&#xff0c;支持周期 7 個月&#xff09;&#xff0c;EE 即企業版&#xff0c;強調安全&#xff0c;付費使用&#xff0c;支持周期 24 個月。 Docker CE 分為 stable test 和 nightly 三個更新頻道。 官方網站上…

文件底層的理解之緩沖區

目錄 一、緩沖區的初步認識 二、向文件中寫數據的具體過程 三、緩沖區刷新的時機 一、緩沖區的初步認識 緩沖區其實就是一塊內存區域&#xff0c;采用空間來換時間&#xff0c;可以提高使用者的效率。我們一直說的緩沖區其實是語言層面上的緩沖區&#xff0c;其實操作系統內部…

JVM 第一部分 JVM兩種解釋器 類加載過程和類加載器

JVM是跨平臺跨語言的虛擬機&#xff0c;不直接接觸硬件&#xff0c;位于操作系統的上一層 跟字節碼文件直接關聯&#xff0c;和語言沒有關系 一次編譯成字節碼文件&#xff0c;多次執行 虛擬機可以分成三部分&#xff1a;類加載器&#xff0c;運行時數據區&#xff0c;執行引…

TDengine 在 DISTRIBUTECH 分享輸配電數據管理實踐

2 月 27-29 日&#xff0c;2024 美國國際輸配電電網及公共事業展&#xff08;DISTRIBUTECH International 2024&#xff09;在美國-佛羅里達州-奧蘭多國家會展中心舉辦。作為全球領先的年度輸配電行業盛會&#xff0c;也是美洲地區首屈一指的專業展覽會&#xff0c;該展會的舉辦…

C++從零開始的打怪升級之路(day41)

這是關于一個普通雙非本科大一學生的C的學習記錄貼 在此前&#xff0c;我學了一點點C語言還有簡單的數據結構&#xff0c;如果有小伙伴想和我一起學習的&#xff0c;可以私信我交流分享學習資料 那么開啟正題 今天分享的是關于繼承的知識點 1.派生類的默認成員函數 首先我…

【和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告

【&#x1f40b;和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告 文章目錄 【&#x1f40b;和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告1 業務背景2 數據說明3 數據探索性分析4 用戶行為分析4.1 用戶屬性與行為關系分析4.2 轉化行為在不同用戶屬性群體中的分布…

值類型和引用類型詳解(C#)

可能你對值類型和引用類型還不太了解。 值類型和引用類型&#xff0c;是c#比較基礎&#xff0c;也必須掌握的知識點&#xff0c;但是也不是那么輕易就能掌握&#xff0c;今天跟著我一起來看看吧。 典型類型 首先我們看看這兩種不同的類型有哪些比較典型的代表。 典型值類型…

【云安全】網絡安全領域安全協議

IPSEC協議 IPSec&#xff08;Internet Protocol Security&#xff09;是一種網絡層安全協議&#xff0c;用于在IP通訊過程中確保完整性、認證性和機密性。它通過在標準的IP協議上加入安全機制來實現加密和認證。IPSec主要由兩個協議組成&#xff1a;認證頭&#xff08;AH&…