js應用opencv

思路:
第一步:直方圖
第二步:獲得直方圖的波峰
第三步:波峰勝負10,高于或低于變紅色

1.引用import cv from ‘@techstark/opencv-js’;
2.vue代碼

 <div class="historyLeft2"><div style="relative: display" v-for="(item, index) in dataReturns3"><el-row><el-col :span="16"><canvas v-if="index === 0" ref="myCanvas" width="230" height="230"></canvas></el-col><el-col :span="8" style="text-align: left;"><el-buttonv-if="tiancongflag==0"type="success" style="margin-top:10px; margin-left:15px; font-size:14px;"size="small"@click="tiancong"round>填充缺陷</el-button><el-buttonv-if="tiancongflag === 1"type="warning" style="margin-top:10px;margin-left:15px;font-size:14px;"size="small"@click="tiancong"round>取消填充</el-button></el-col></el-row></div></div>

3.js代碼

 processBase64Image(base64Data) {const img = new Image();img.onload = () => {if(this.tiancongflag == 1){this.processImage(img);}else{this.processImage2(img);}};console.log(444)img.src = base64Data;},processImage(img) {console.log(img)this.$nextTick(() => {const canvas = this.$refs.myCanvas;const ctx = canvas[0].getContext('2d');var canvasWidth = canvas[0].width;var canvasHeight = canvas[0].height;var imgWidth = img.width;var imgHeight = img.height;var imgYOffset = 20;// 計算寬高比和縮放比例var scaledWidth = 0;var scaledHeight = 0;if (imgWidth > imgHeight) {scaledWidth = 190;scaledHeight = Math.floor(scaledWidth * (imgHeight/imgWidth));} else {scaledHeight = 210;scaledWidth = Math.floor(scaledHeight * (imgWidth/imgHeight));}// 清除 Canvas// ctx.clearRect(0, 0, canvasWidth, canvasHeight);ctx.fillStyle = '#081c31';ctx.strokeStyle = '#081c31';ctx.fillRect(0, 0, canvasWidth, canvasHeight);var x = Math.floor((210 - scaledWidth) / 2);var y = Math.floor((210 - scaledHeight) / 2);ctx.drawImage(img, x, y+imgYOffset, scaledWidth, scaledHeight);// 讀取圖像const src = cv.imread(canvas[0]);// 創建一個目標矩陣用于灰度圖像var gray = new cv.Mat();cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);//它創建了一個矩形區域(ROI,Region of Interest)并從灰度圖像中提取該區域let rect = new cv.Rect(x,y+imgYOffset,scaledWidth,scaledHeight);gray = gray.roi(rect);// 創建 MatVector 并添加灰度圖像const matVector = new cv.MatVector();matVector.push_back(gray);// 計算直方圖const histSize = [256]; // 直方圖的大小const ranges = [0, 256]; // 像素值范圍const hist = new cv.Mat(); // 直方圖結果const channels = [0]; // 通道索引const mask = new cv.Mat(); // 掩碼cv.calcHist(matVector, channels, mask, hist, histSize, ranges);// 找到直方圖的波峰const histData = hist.data32F; // 獲取直方圖數據let maxVal = 0;let maxIdx = 0;for (let i = 0; i < histSize[0]; i++) {if (histData[i] > maxVal) {maxVal = histData[i];maxIdx = i;}}// 波峰 ±150 的范圍const lowerBound = maxIdx - 25;const upperBound = maxIdx + 25;console.log("222")console.log(maxIdx);// 創建一個紅色的圖像const redImage = new cv.Mat(src.rows, src.cols, src.type(), [255, 0, 0, 255]);for (let i = y+imgYOffset; i < y+imgYOffset+scaledHeight; i++) {for (let j = x; j < x+scaledWidth; j++) {const pixel = src.ucharPtr(i, j)[1];if (pixel < lowerBound || pixel > upperBound) {// 將不在波峰 ±150 范圍內的像素變為紅色src.ucharPtr(i, j)[0] = 255; // Rsrc.ucharPtr(i, j)[1] = 0;   // Gsrc.ucharPtr(i, j)[2] = 0;   // B}}}// 顯示結果cv.imshow(canvas[0], src);// 釋放內存src.delete();gray.delete();matVector.delete();hist.delete();mask.delete();redImage.delete();// result.delete();// 繪制刻度線const scaleLineY = y+20; // 刻度線距離頂部的距離(原為20,增加5個單位)const scaleLineLength = scaledWidth; // 刻度線的長度const scaleLineX =x; // 刻度線的起始X坐標ctx.strokeStyle = '#fbf321'; // 刻度線顏色ctx.lineWidth = 2; // 刻度線寬度ctx.beginPath();ctx.moveTo(scaleLineX, scaleLineY);ctx.lineTo(scaleLineX + scaleLineLength, scaleLineY);ctx.stroke();// 繪制刻度標記(可選)const numTicks = 10; // 刻度標記的數量const tickLength = 5; // 刻度標記的長度const middleTickLength = 10; // 中間刻度標記的長度const tickSpacing = scaleLineLength / numTicks; // 刻度標記之間的間距for (let i = 0; i <= numTicks; i++) {const tickX = scaleLineX + i * tickSpacing;const isMiddleTick = i === numTicks / 2; // 判斷是否為中間刻度const currentTickLength = isMiddleTick ? middleTickLength : tickLength; // 如果是中間刻度,使用更長的長度ctx.beginPath();ctx.moveTo(tickX, scaleLineY);ctx.lineTo(tickX, scaleLineY - currentTickLength); // 刻度線向上繪制ctx.stroke();// 在最左面標注“0”if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'left'; // 文本左對齊ctx.textBaseline = 'bottom'; // 文本底部對齊ctx.fillText('0', tickX, scaleLineY - currentTickLength - 1); // 在刻度線上方標注“0”}}// 標注圖像長度ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'right'; // 文本右對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊// 在刻度線最右面標注圖像長度const labelX = scaleLineX + scaleLineLength + 20; // 文本的X坐標(刻度線最右端 + 10個單位)const labelY = scaleLineY - 11; // 文本的Y坐標(在刻度線上方,原為15,增加5個單位)if (this.flagf == 1) {ctx.fillText(`${(imgWidth * 0.098).toFixed(2)}mm`, labelX, labelY);} else {ctx.fillText(`${(imgWidth * 0.103).toFixed(2)}mm`, labelX, labelY);}// 右側刻度線的位置和長度const scaleLineXRight = scaleLineX + scaledWidth; // 右側刻度線的X坐標(圖片右側偏移20像素)const scaleLineYRight = y+20; // 右側刻度線的Y坐標(從頂部開始)var scaleLineLengthRight = 0;if (imgHeight - imgWidth > 30) {scaleLineLengthRight = scaledHeight; // 右側刻度線的長度(與圖片高度相同)} else {scaleLineLengthRight = scaledHeight; // 右側刻度線的長度(與圖片高度相同)}// 繪制右側刻度線ctx.strokeStyle = '#fbf321'; // 刻度線顏色ctx.lineWidth = 2; // 刻度線寬度ctx.beginPath();ctx.moveTo(scaleLineXRight, scaleLineYRight);ctx.lineTo(scaleLineXRight, scaleLineYRight + scaleLineLengthRight);ctx.stroke();// 繪制右側刻度標記(可選)const numTicksRight = 10; // 刻度標記的數量const tickLengthRight = 5; // 刻度標記的長度const middleTickLengthRight = 10; // 中間刻度標記的長度const tickSpacingRight = scaleLineLengthRight / numTicksRight; // 刻度標記之間的間距for (let i = 0; i <= numTicksRight; i++) {const tickY = scaleLineYRight + i * tickSpacingRight;const isMiddleTick = i === numTicksRight / 2; // 判斷是否為中間刻度const currentTickLength = isMiddleTick ? middleTickLengthRight : tickLengthRight; // 如果是中間刻度,使用更長的長度ctx.beginPath();ctx.moveTo(scaleLineXRight, tickY);ctx.lineTo(scaleLineXRight + currentTickLength, tickY); // 刻度線向右繪制ctx.stroke();// 在最上面的刻度位置顯示 "0"if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'left'; // 文本左對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊ctx.fillText('0', scaleLineXRight + currentTickLength + 5, tickY); // 在刻度線右側繪制 "0"}}// 標注圖像高度ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'center'; // 文本居中對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊// 在右側刻度線最下面標注圖像高度const labelXRight = scaleLineXRight + 30; // 文本的X坐標(刻度線右側偏移15像素)const labelYRight = scaleLineYRight + scaleLineLengthRight - 10; // 文本的Y坐標(在刻度線最下面)if (this.flagf == 1) {ctx.fillText(`${(imgHeight * 0.098).toFixed(2)}mm`, labelXRight, labelYRight); // 繪制文本} else {ctx.fillText(`${(imgHeight * 0.103).toFixed(2)}mm`, labelXRight, labelYRight); // 繪制文本}});},processImage2(img) {this.$nextTick(() => {console.log("ppsasasa")const canvas = this.$refs.myCanvas;const ctx = canvas[0].getContext('2d');var canvasWidth = canvas[0].width;var canvasHeight = canvas[0].height;var imgWidth = img.width;var imgHeight = img.height;var imgYOffset = 20;// 計算寬高比和縮放比例var scaledWidth = 0;var scaledHeight = 0;if (imgWidth > imgHeight) {scaledWidth = 190;scaledHeight = Math.floor(scaledWidth * (imgHeight/imgWidth));} else {scaledHeight = 210;scaledWidth = Math.floor(scaledHeight * (imgWidth/imgHeight));}// 清除 Canvasctx.clearRect(0, 0, canvasWidth, canvasHeight);ctx.fillStyle = '#081c31';ctx.strokeStyle = '#081c31';ctx.fillRect(0, 0, canvasWidth, canvasHeight);var x = Math.floor((210 - scaledWidth) / 2);var y = Math.floor((210 - scaledHeight) / 2);ctx.drawImage(img, x, y+imgYOffset, scaledWidth, scaledHeight);// 讀取圖像const src = cv.imread(canvas[0]);// // 創建一個目標矩陣用于灰度圖像// const gray = new cv.Mat();// cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);// // 創建一個二值化圖像,將白色區域分離出來// const binary = new cv.Mat();// cv.threshold(gray, binary, 170, 255, cv.THRESH_BINARY);// // // 將二值化圖像作為掩碼,將紅色圖像應用到白色區域// const result = new cv.Mat();// // 將原始圖像中非白色區域保留// cv.bitwise_not(binary, binary);// cv.bitwise_and(src, src, result, binary);// // 顯示結果// cv.imshow(canvas[0], result);// // 釋放內存// src.delete();// gray.delete();// binary.delete();// result.delete();// 繪制刻度線const scaleLineY = y+20; // 刻度線距離頂部的距離(原為20,增加5個單位)const scaleLineLength = scaledWidth; // 刻度線的長度const scaleLineX =x; // 刻度線的起始X坐標ctx.strokeStyle = '#fbf321'; // 刻度線顏色ctx.lineWidth = 2; // 刻度線寬度ctx.beginPath();ctx.moveTo(scaleLineX, scaleLineY);ctx.lineTo(scaleLineX + scaleLineLength, scaleLineY);ctx.stroke();// 繪制刻度標記(可選)const numTicks = 10; // 刻度標記的數量const tickLength = 5; // 刻度標記的長度const middleTickLength = 10; // 中間刻度標記的長度const tickSpacing = scaleLineLength / numTicks; // 刻度標記之間的間距for (let i = 0; i <= numTicks; i++) {const tickX = scaleLineX + i * tickSpacing;const isMiddleTick = i === numTicks / 2; // 判斷是否為中間刻度const currentTickLength = isMiddleTick ? middleTickLength : tickLength; // 如果是中間刻度,使用更長的長度ctx.beginPath();ctx.moveTo(tickX, scaleLineY);ctx.lineTo(tickX, scaleLineY - currentTickLength); // 刻度線向上繪制ctx.stroke();// 在最左面標注“0”if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'left'; // 文本左對齊ctx.textBaseline = 'bottom'; // 文本底部對齊ctx.fillText('0', tickX, scaleLineY - currentTickLength - 1); // 在刻度線上方標注“0”}}// 標注圖像長度ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'right'; // 文本右對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊// 在刻度線最右面標注圖像長度const labelX = scaleLineX + scaleLineLength + 20; // 文本的X坐標(刻度線最右端 + 10個單位)const labelY = scaleLineY - 11; // 文本的Y坐標(在刻度線上方,原為15,增加5個單位)if (this.flagf == 1) {ctx.fillText(`${(imgWidth * 0.098).toFixed(2)}mm`, labelX, labelY);} else {ctx.fillText(`${(imgWidth * 0.103).toFixed(2)}mm`, labelX, labelY);}// 右側刻度線的位置和長度const scaleLineXRight = scaleLineX + scaledWidth; // 右側刻度線的X坐標(圖片右側偏移20像素)const scaleLineYRight = y+20; // 右側刻度線的Y坐標(從頂部開始)var scaleLineLengthRight = 0;if (imgHeight - imgWidth > 30) {scaleLineLengthRight = scaledHeight; // 右側刻度線的長度(與圖片高度相同)} else {scaleLineLengthRight = scaledHeight; // 右側刻度線的長度(與圖片高度相同)}// 繪制右側刻度線ctx.strokeStyle = '#fbf321'; // 刻度線顏色ctx.lineWidth = 2; // 刻度線寬度ctx.beginPath();ctx.moveTo(scaleLineXRight, scaleLineYRight);ctx.lineTo(scaleLineXRight, scaleLineYRight + scaleLineLengthRight);ctx.stroke();// 繪制右側刻度標記(可選)const numTicksRight = 10; // 刻度標記的數量const tickLengthRight = 5; // 刻度標記的長度const middleTickLengthRight = 10; // 中間刻度標記的長度const tickSpacingRight = scaleLineLengthRight / numTicksRight; // 刻度標記之間的間距for (let i = 0; i <= numTicksRight; i++) {const tickY = scaleLineYRight + i * tickSpacingRight;const isMiddleTick = i === numTicksRight / 2; // 判斷是否為中間刻度const currentTickLength = isMiddleTick ? middleTickLengthRight : tickLengthRight; // 如果是中間刻度,使用更長的長度ctx.beginPath();ctx.moveTo(scaleLineXRight, tickY);ctx.lineTo(scaleLineXRight + currentTickLength, tickY); // 刻度線向右繪制ctx.stroke();// 在最上面的刻度位置顯示 "0"if (i === 0) {ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'left'; // 文本左對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊ctx.fillText('0', scaleLineXRight + currentTickLength + 5, tickY); // 在刻度線右側繪制 "0"}}// 標注圖像高度ctx.fillStyle = '#ffffff'; // 文本顏色ctx.font = '12px Arial'; // 字體大小和樣式ctx.textAlign = 'center'; // 文本居中對齊ctx.textBaseline = 'middle'; // 文本垂直居中對齊// 在右側刻度線最下面標注圖像高度const labelXRight = scaleLineXRight + 30; // 文本的X坐標(刻度線右側偏移15像素)const labelYRight = scaleLineYRight + scaleLineLengthRight - 10; // 文本的Y坐標(在刻度線最下面)if (this.flagf == 1) {ctx.fillText(`${(imgHeight * 0.098).toFixed(2)}mm`, labelXRight, labelYRight); // 繪制文本} else {ctx.fillText(`${(imgHeight * 0.103).toFixed(2)}mm`, labelXRight, labelYRight); // 繪制文本}});},

在這里插入圖片描述
當然還有一些屬性看官網了解下,只要什么時候用什么就可以

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

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

相關文章

用Python代碼繪制動態3D愛心效果

引言 介紹Python在創意編程中的應用&#xff0c;特別是如何通過簡單的代碼實現視覺上的美感。引出本文將分享的愛心代碼&#xff0c;并簡要說明其實現原理。 愛心代碼的基本實現 展示一個簡單的Python代碼示例&#xff0c;使用字符畫的方式在控制臺中繪制一個愛心圖案。 pr…

使用Python開發經典俄羅斯方塊游戲

使用Python開發經典俄羅斯方塊游戲 在這篇教程中&#xff0c;我們將學習如何使用Python和Pygame庫開發一個經典的俄羅斯方塊游戲。這個項目將幫助你理解游戲開發的基本概念&#xff0c;包括圖形界面、用戶輸入處理、碰撞檢測等重要內容。 項目概述 我們將實現以下功能&…

兼顧長、短視頻任務的無人機具身理解!AirVista-II:面向動態場景語義理解的無人機具身智能體系統

作者&#xff1a;Fei Lin 1 ^{1} 1, Yonglin Tian 2 ^{2} 2, Tengchao Zhang 1 ^{1} 1, Jun Huang 1 ^{1} 1, Sangtian Guan 1 ^{1} 1, and Fei-Yue Wang 2 , 1 ^{2,1} 2,1單位&#xff1a; 1 ^{1} 1澳門科技大學創新工程學院工程科學系&#xff0c; 2 ^{2} 2中科院自動化研究所…

【藍橋杯省賽真題49】python偶數 第十五屆藍橋杯青少組Python編程省賽真題解析

python偶數 第十五屆藍橋杯青少組python比賽省賽真題詳細解析 博主推薦 所有考級比賽學習相關資料合集【推薦收藏】1、Python比賽 信息素養大賽Python編程挑戰賽 藍橋杯python選拔賽真題詳解

鴻蒙(HarmonyOS)應用開發入門教程

目錄 第一章:鴻蒙系統簡介 1.1 什么是鴻蒙系統? 1.2 鴻蒙系統架構 第二章:開發環境搭建 2.1 安裝DevEco Studio 步驟1:下載與安裝 步驟2:首次配置 步驟3:設備準備 2.2 創建第一個項目 第三章:鴻蒙應用開發基礎 3.1 核心概念:Ability與AbilitySlice 示例代碼…

VM中 ubuntu 網卡不顯示

1.添加網卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看網絡狀態 sudo systemctl start systemd-networkd sudo systemctl status sy…

阿克曼-幻宇機器人系列教程3- 機器人交互實踐(Message)

上一篇文章介紹了如何通過topic操作命令實現與機器人的交互&#xff0c;本篇我們介紹如何通過Message&#xff08;即topic的下一級&#xff09;實現與機器人的交互。 和topic一樣&#xff0c;首先在一個終端通過ssh命令登錄機器人、啟動機器人&#xff0c;然后打開另外一個終端…

Python 調試擴展版本兼容問題解決紀實

在 Python 開發中&#xff0c;調試工具的正常使用對效率至關重要。近期在公司項目中&#xff0c;便遇到了 Python 調試擴展與版本不兼容的問題。公司 ERP 服務器采用 Ubuntu 18.04 系統&#xff0c;其標配 Python 版本為 3.6&#xff0c;而常用的 Python Debugger 擴展對版本有…

React 第四十二節 Router 中useLoaderData的用途詳解

一、前言 useLoaderData&#xff0c;用于在組件中獲取路由預加載的數據。它通常與路由配置中的 loader 函數配合使用&#xff0c;用于在頁面渲染前異步獲取數據&#xff08;如 API 請求&#xff09;&#xff0c;并將數據直接注入組件&#xff0c;從而簡化數據流管理。 二、us…

Linux——mysql主從復制與讀寫分離

目錄 一&#xff0c;理解什么是mysql主從復制 1&#xff0c;mysql支持的復制類型 2&#xff0c;mysql主從復制的工作流程 二&#xff0c;配置mysql主從復制 三&#xff0c;配置mysql主主復制 四&#xff0c;mysql讀寫分離 1&#xff0c;了解什么是mysql讀寫分離 2&…

MongoDB數據庫深度解析:架構、特性與應用場景

在現代應用程序開發中&#xff0c;數據存儲技術的選擇至關重要。在眾多的數據庫管理系統中&#xff0c;MongoDB以其靈活性和強大的功能迅速崛起&#xff0c;成為NoSQL數據庫中的佼佼者。本文將深入解析MongoDB的架構、核心特性、性能優化及其在實際應用中的最佳實踐&#xff0c…

3D曲面上的TSP問題(一):曲面上點集距離求解

3D曲面上&#xff0c;兩點的距離求解不能采用歐式距離&#xff0c;而需要計算測地線距離。 代碼使用CGAL 5.6.2 OpenCV 4.11.0 版本實現 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲結構】2:小節與歌曲結構信息整合

歌曲小節與結構信息整合 我將為您整合小節信息與歌曲結構,創建一個更加詳細的JSON數據結構。 處理方法 將小節時間與歌曲結構段落進行匹配為每個小節添加所屬段落信息為小節添加格式化的時間戳為小節添加對應時間范圍內的歌詞{"song_title": "財神廟前許三億…

C語言:深入理解指針(3)

目錄 一、數組名的理解 二、用指針訪問數組 三、一維數組傳參的本質 四、冒泡排序 五、二級指針 六、指針數組 七、指針數組模擬二維數組 八、結語 一、數組名的理解 數組名其實就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…

Spring MVC 接口的訪問方法如何設置

RequestMapping 是 Spring 框架中用于映射 HTTP 請求到控制器方法的注解。它支持以下 HTTP 方法訪問類型&#xff0c;通過 method 屬性指定&#xff1a; GET&#xff1a;用于獲取資源POST&#xff1a;用于提交數據PUT&#xff1a;用于更新資源DELETE&#xff1a;用于刪除資源PA…

linux libdbus使用案例

以下是一個基于 Linux libdbus 的詳細指南,包含服務端和客戶端的完整代碼示例,涵蓋 方法調用、信號發送 和 異步消息處理。libdbus 是 D-Bus 的底層 C 庫,直接操作 D-Bus 協議,適合需要精細控制的場景。 1. libdbus 的核心機制 連接管理:通過 dbus_bus_get 連接系統總線或…

Day118 | 靈神 | 二叉樹 | 刪點成林

Day118 | 靈神 | 二叉樹 | 刪點成林 1110.刪點成林 1110. 刪點成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看當前結點的值是不是在要刪除的列表中&#xff0c;在的話刪除當前結點并把左右孩子加入res中 很可惜這樣是錯的&#xff0c;…

趣味編程:鐘表

目錄 1. 效果展示 2. 源碼展示 3. 邏輯概述 3.1 表針繪制函數&#xff08;DrawHand&#xff09; 3.2 表盤繪制函數 3.3 主程序邏輯 4. 小結 概述&#xff1a;本篇博客主要介紹簡易鐘表的繪制。 1. 效果展示 該鐘表會隨著系統的時間變化而變化&#xff0c;動態的效…

ansible進階02

管理主機清單變量 使用變量的原則 變量創建的位置 角色的defaults或vars目錄主機清單playbook或主機清單所在位置的子目錄group_vars和host_varsplay或角色或任務 無論在哪創建變量&#xff0c;都應該遵守一些規則&#xff1a; 保持簡潔不要重復造輪子。不要反復在多個位置…

C40-指針

一 指針的引入 什么是指針:指針是一個變量&#xff0c;其值是另一個變量的內存地址 簡單的使用地址輸出一個變量: 代碼示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*號是取值運算符…