三子棋裝置(電賽24E題)K230/STM32全開源

三子棋裝置(電賽24E題)K230/STM32全開源,后續有具體代碼參數講解,幫助大家移植

k230代碼

import time, os, sysfrom media.sensor import *
from media.display import *
from media.media import *from machine import UART
from machine import FPIOA
from machine import TimerUartFlag=False#串口數據接收標志# 配置引腳
fpioa = FPIOA()
fpioa.set_function(11, FPIOA.UART2_TXD)
fpioa.set_function(12, FPIOA.UART2_RXD)# 初始化UART2,波特率115200,8位數據位,無校驗,1位停止位
uart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)sensor_id = 2
sensor = None# 構造一個具有默認配置的攝像頭對象
sensor = Sensor(id=sensor_id,width=1920, height=1080)
# 重置攝像頭sensor
sensor.reset()
# 無需進行鏡像和翻轉
# 設置不要水平鏡像
sensor.set_hmirror(False)
# 設置不要垂直翻轉
sensor.set_vflip(False)
sensor.set_framesize(width=800, height=480, chn=CAM_CHN_ID_0)
# 設置通道0的輸出像素格式為RGB565,要注意有些案例只支持GRAYSCALE格式
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)Display.init(Display.ST7701, width=800, height=480, to_ide=True)# 初始化媒體管理器
MediaManager.init()
# 啟動傳感器
sensor.run()
# 丟掉前面50幀數據,防止攝像頭還不穩定
for i in range(50):sensor.snapshot()fps = time.clock()correction_points = [[268, 72], [635, 64],[708, 469], [226, 476]]
taruge_rect= [[57, 412],[411, 411],[411, 29],[55,29]]
# 棋盤數組
# 黑子:X
# 白子:O
# 沒有棋子:空字符串
board = [[" "," "," "],[" "," "," "],[" "," "," "],
]#標準灰度值
std_grayscale_values = [[0,0,0],[0,0,0],[0,0,0],
]'''
#實際坐標系九宮格中心位置
中心點順序為從左到右、從上到下:
第一行:中心點1(左)、中心點2(中)、中心點3(右)
第二行:中心點4(左)、中心點5(中)、中心點6(右)
第三行:中心點7(左)、中心點8(中)、中心點9(右)
'''
centers_real=[]
#白色棋子位置
white_positions=[[25,0],[50,0],[75,0],[100,0],[125,0]]
white_cnt=0
#黑色棋子位置
black_positions=[[25,155],[50,155],[75,155],[100,155],[125,155]]
black_cnt=0
'''
獲得九宮格灰度
'''
def get_grid_region_grayscale():# 1. 對四個頂點排序(tl, tr, br, bl) = [[0, 0],[480, 0],[480, 480],[0,480]]# 2. 計算大正方形的寬度和高度width = max(abs(tr[0]-tl[0]), abs(br[0]-bl[0]))height = max(abs(bl[1]-tl[1]), abs(br[1]-tr[1]))# 3. 計算每個小格子的寬度和高度cell_width = width / 3cell_height = height / 3# 4. 計算中心區域的大小(按比例)region_w = int(cell_width * 0.3)region_h = int(cell_height * 0.3)# 5. 存儲9個格子的灰度值grayscale_values = [[0,0,0],[0,0,0],[0,0,0]]for i in range(3):  # 行 (y方向)for j in range(3):  # 列 (x方向)# 計算當前格子的左上角坐標cell_x = tl[0] + j * cell_widthcell_y = tl[1] + i * cell_height# 計算中心區域的坐標center_x = cell_x + cell_width / 2center_y = cell_y + cell_height / 2# 提取中心區域 (region_w × region_h)x1 = int(center_x - region_w / 2)y1 = int(center_y - region_h / 2)x2 = int(center_x + region_w / 2)y2 = int(center_y + region_h / 2)# 防止越界x1 = max(0, x1)y1 = max(0, y1)x2 = min(img.width()-1, x2)y2 = min(img.height()-1, y2)# 計算該區域的平均灰度img.draw_rectangle(x1, y1, x2-x1, y2-y1,color=(255,255,255))region = img.get_statistics(roi=(x1, y1, x2-x1, y2-y1))grayscale_values[i][j]=region.l_mean()return grayscale_values'''
更新棋盤信息
'''
def update_board():global boardimg = sensor.snapshot() # Take a picture and return the image.img.gamma_corr(0.8)img.rotation_corr(corners = (correction_points[:4]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑#for n in range(4):#img.draw_cross(int(taruge_rect[n][0]),int(taruge_rect[n][1]))img.rotation_corr(corners = (taruge_rect[3],taruge_rect[2],taruge_rect[1],taruge_rect[0]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑grayscale_values=get_grid_region_grayscale()for i in range(3):  # 行 (y方向)for j in range(3):  # 列 (x方向)if grayscale_values[i][j]-std_grayscale_values[i][j]>10:board[i][j]='O'elif grayscale_values[i][j]-std_grayscale_values[i][j]<-10:board[i][j]='X'else:board[i][j]=" "print(board[i])#print(grayscale_values[i])print('......')'''
初始化標準灰度
'''
def init_std_grayscale_values():global std_grayscale_valuesimg = sensor.snapshot() # Take a picture and return the image.img.gamma_corr(0.8)img.rotation_corr(corners = (correction_points[:4]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑#for n in range(4):#img.draw_cross(int(taruge_rect[n][0]),int(taruge_rect[n][1]))img.rotation_corr(corners = (taruge_rect[3],taruge_rect[2],taruge_rect[1],taruge_rect[0]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑std_grayscale_values=get_grid_region_grayscale()"""
計算四邊形內 9 宮格的 9 個中心點坐標,同步更新真實坐標系下的坐標
參數:corners: 四邊形的 4 個角點,順序為 [左下, 右下,右上 , 左上]
返回: 9 個中心點的列表,順序為從左到右、從上到下中心點順序為從左到右、從上到下:第一行:中心點1(左)、中心點2(中)、中心點3(右)第二行:中心點4(左)、中心點5(中)、中心點6(右)第三行:中心點7(左)、中心點8(中)、中心點9(右)
"""
def get_nine_grid_centers(corners):global centers_real# 提取四個角點lb = corners[0]  # 左下 (u=0, v=0)rb = corners[1]  # 右下 (u=1, v=0)rt = corners[2]  # 右上 (u=1, v=1)lt = corners[3]  # 左上 (u=0, v=1)# 雙線性插值函數def bilinear_interp(u, v):x = (1-u)*(1-v)*lb[0] + u*(1-v)*rb[0] + u*v*rt[0] + (1-u)*v*lt[0]y = (1-u)*(1-v)*lb[1] + u*(1-v)*rb[1] + u*v*rt[1] + (1-u)*v*lt[1]return (x, y)# 計算9個中心點(從左到右,從上到下)tmp=[]centers = []for v in [5/6, 3/6, 1/6]:  # 從上到下(v=1是頂部,v=0是底部)for u in [1/6, 3/6, 5/6]:  # 從左到右(u=0是左側,u=1是右側)center = bilinear_interp(u, v)centers.append(center)center_real =(center[1]*13/48+11, center[0]*13/48+11)#x,y反轉tmp.append(center_real)centers_real=tmpreturn centers"""
輸入當前棋盤和執棋顏色,返回最佳下棋位置 (row, col)參數:board: 3x3 的二維列表,表示當前棋盤,例如:[["X", " ", "O"],[" ", "X", " "],["O", " ", " "]]player_color: 0 表示白棋 (O),1 表示黑棋 (X)返回:(row, col): 最佳下棋位置,行列范圍 0-2
"""
def get_best_move(board, player_color):# 預計算所有可能的贏法(8 種:3行 + 3列 + 2對角線)win_patterns = [[(0, 0), (0, 1), (0, 2)],  # 第一行[(1, 0), (1, 1), (1, 2)],  # 第二行[(2, 0), (2, 1), (2, 2)],  # 第三行[(0, 0), (1, 0), (2, 0)],  # 第一列[(0, 1), (1, 1), (2, 1)],  # 第二列[(0, 2), (1, 2), (2, 2)],  # 第三列[(0, 0), (1, 1), (2, 2)],  # 主對角線[(0, 2), (1, 1), (2, 0)]   # 副對角線]def evaluate(b):"""快速評估當前棋盤是否有玩家獲勝"""for pattern in win_patterns:cells = [b[i][j] for (i, j) in pattern]if cells[0] == cells[1] == cells[2] != " ":return 1 if cells[0] == "X" else -1return 0  # 無勝負或平局def minimax(b, depth, alpha, beta, is_maximizing):"""帶 Alpha-Beta 剪枝的極小化極大算法"""score = evaluate(b)if score != 0:  # 有玩家獲勝return scoreif all(cell != " " for row in b for cell in row):  # 平局return 0if is_maximizing:max_score = -float("inf")for i in range(3):for j in range(3):if b[i][j] == " ":b[i][j] = "X"current_score = minimax(b, depth + 1, alpha, beta, False)b[i][j] = " "max_score = max(max_score, current_score)alpha = max(alpha, current_score)if beta <= alpha:  # Alpha-Beta 剪枝breakreturn max_scoreelse:min_score = float("inf")for i in range(3):for j in range(3):if b[i][j] == " ":b[i][j] = "O"current_score = minimax(b, depth + 1, alpha, beta, True)b[i][j] = " "min_score = min(min_score, current_score)beta = min(beta, current_score)if beta <= alpha:  # Alpha-Beta 剪枝breakreturn min_scoreplayer = "X" if player_color == 1 else "O"best_score = -float("inf") if player == "X" else float("inf")best_move = (-1, -1)alpha = -float("inf")beta = float("inf")for i in range(3):for j in range(3):if board[i][j] == " ":board[i][j] = playerscore = minimax(board, 0, alpha, beta, player == "O")board[i][j] = " "if (player == "X" and score > best_score) or (player == "O" and score < best_score):best_score = scorebest_move = (i, j)# 更新 Alpha/Betaif player == "X":alpha = max(alpha, best_score)else:beta = min(beta, best_score)return best_move'''
找矩形外框
'''
loop=True#False#
last_taruge_rect = [[0,0],[0,0],[0,0],[0,0]]  #記錄上一次識別到的定點數據,用來判斷數據是否穩定
matching_counts = 0#記錄識別穩定不變的次數,達到一定數量則判斷識別成功
while(loop):img = sensor.snapshot() # Take a picture and return the image.#img.gamma_corr(0.8)img.rotation_corr(corners = (correction_points[:4]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(0,0,0),fill=True)    #右側空白處涂黑img.midpoint(2, bias=0.9, threshold=True, offset=10, invert=True)    #凸顯黑線rr = img.find_rects(threshold=500000)   #找矩形if rr:  #如果有目標for r in rr:img.draw_rectangle(r.rect(), color = (255, 0, 0))   #在屏幕繪制標識框taruge_rect = r.corners()  #存儲方框頂點坐標for n in range(4):#對比方框定點坐標數據的變動情況,判斷是否獲取成功for n2 in range(2):#注意,此處判斷閾值為3,如果畫面不穩定,可能程序無法向后進行。可以修改閾值。另外還可以增加低通濾波。if abs(taruge_rect[n][n2] - last_taruge_rect[n][n2]) < 30:matching_counts += 1print(matching_counts)else:matching_counts = 0print('識別失敗')last_taruge_rect = taruge_rectif matching_counts > 10:loop = Falseprint('識別成功')#print(taruge_rect)#img.draw_string_advanced(50,50,80,"fps:{}".format(fps.fps()*10000),color=(255,0,0))Display.show_image(img)
init_std_grayscale_values()
centers=get_nine_grid_centers(taruge_rect)
UartFlag=True#開始接收串口數據
#print(centers)
#print(centers_real)
'''
while(True):img = sensor.snapshot() # Take a picture and return the image.img.rotation_corr(corners = (correction_points[:4]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑for i in range(9):img.draw_cross(int(centers[i][0]),int(centers[i][1]))Display.show_image(img)
'''
def TimCallBack(timer):global white_positions,black_positions,white_cnt,black_cnt,UartFlag,boardif UartFlag:data = uart.read()if data:#通過CanMV IDE K230中的串行終端控制臺打印出來hex_str = data.hex()  # 轉為16進制字符串print('收到數字:',hex_str)# 提取第一個字節的高低4位high_nibble = int(hex_str[0], 16)low_nibble = int(hex_str[1], 16)print(high_nibble,low_nibble)if high_nibble==0:uart.write(f"X{white_positions[white_cnt][0]:.2f}Y{white_positions[white_cnt][1]:.2f}P")white_cnt+=1time.sleep_ms(4000)uart.write(f"X{centers_real[low_nibble-1][0]:.2f}Y{centers_real[low_nibble-1][1]:.2f}L")#print('.....')#print(f"X{white_positions[white_cnt][0]:.2f}Y{white_positions[white_cnt][1]:.2f}P")#print(f"X{centers_real[low_nibble][0]:.2f}Y{centers_real[low_nibble][1]:.2f}L")elif high_nibble==1:uart.write(f"X{black_positions[black_cnt][0]:.2f}Y{black_positions[black_cnt][1]:.2f}P")black_cnt+=1time.sleep_ms(4000)uart.write(f"X{centers_real[low_nibble-1][0]:.2f}Y{centers_real[low_nibble-1][1]:.2f}L")elif high_nibble==5:#執白棋update_board()x,y=get_best_move(board,0)uart.write(f"X{white_positions[white_cnt][0]:.2f}Y{white_positions[white_cnt][1]:.2f}P")white_cnt+=1time.sleep_ms(4000)uart.write(f"X{centers_real[3*x+y][0]:.2f}Y{centers_real[3*x+y][1]:.2f}L")print('.....')print(x,y)#print(f"X{centers_real[3*x+y][0]:.2f}Y{centers_real[3*x+y][1]:.2f}L")elif high_nibble==6:#執黑棋update_board()x,y=get_best_move(board,1)uart.write(f"X{black_positions[black_cnt][0]:.2f}Y{black_positions[black_cnt][1]:.2f}P")black_cnt+=1time.sleep_ms(4000)uart.write(f"X{centers_real[3*x+y][0]:.2f}Y{centers_real[3*x+y][1]:.2f}L")print('.....')print(x,y)#print(f"X{centers_real[3*x+y][0]:.2f}Y{centers_real[3*x+y][1]:.2f}L")
# 創建一個軟件定時器實例,-1 表示使用軟件定時器
tim = Timer(-1)# 配置定時器,定時2000毫秒
tim.init(period=2000, mode=Timer.PERIODIC, callback=TimCallBack)while(True):img = sensor.snapshot() # Take a picture and return the image.img.gamma_corr(0.8)img.rotation_corr(corners = (correction_points[:4]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑img.rotation_corr(corners = (taruge_rect[3],taruge_rect[2],taruge_rect[1],taruge_rect[0]))   #畫面梯形校正img.draw_image(img,0,0,x_size=480,y_size=480)   #縮放畫面至正常比例img.draw_rectangle(480,0,320,480,color=(255,255,255),fill=True)    #右側空白處涂黑'''update_board()(y,x)=get_best_move(board,1)img.draw_cross(80+160*x,80+160*y)'''Display.show_image(img)time.sleep_ms(1000)

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

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

相關文章

終端安全檢測與防御

1. 終端安全風險主要問題&#xff1a;企業網絡中80%的安全事件源于終端&#xff0c;終端成為黑客攻擊的重要目標。攻擊手段&#xff1a;勒索病毒&#xff1a;直接勒索用戶。橫向滲透&#xff1a;通過受控終端攻擊內部服務器。僵尸網絡危害&#xff1a;信息竊取、釣魚網站引導、…

Video_AVI_Packet(2)

博主聲明&#xff1a;內容來自網絡&#xff0c;僅供參考&#xff0c;僅適用于淺了解&#xff0c;如有錯誤&#xff0c;自行甄別&#xff0c;由此引起的后果概不負責 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 與 Active Format Aspect Ratio1.…

八月補丁星期二:微軟修復 111 個漏洞

微軟將在2025 年 8 月補丁星期二修復 111 個漏洞&#xff0c;這一數量與近期平均水平大致相同。 與上個月的情況類似&#xff0c;微軟知道今天發布的漏洞中只有一個已被公開披露&#xff0c;但聲稱沒有證據表明存在野外利用。同樣&#xff0c;截至發布時&#xff0c;唯一的補丁…

《C++進階之繼承多態》【普通類/模板類的繼承 + 父類子類的轉換 + 繼承的作用域 + 子類的默認成員函數】

【普通類/模板類的繼承 父類&子類的轉換 繼承的作用域 子類的默認構造函數】目錄前言&#xff1a;------------------------一、繼承的定義和使用1. 什么使繼承&#xff1f;2. 為什么要引入繼承&#xff1f;3. 怎么使用繼承&#xff1f;① 父類&#xff08;基類&#xf…

Ubuntu22.04安裝OBS Studio

OBS官網的最新的雖然支持Ubuntu系統&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的電腦上的Ubuntu的版本是22.04&#xff0c;所以在網上尋求解決辦法&#xff0c;看到了這一片博客&#xff0c;作為參考來實現ubuntu22.04安裝OBS&#xff0c;這里提示一下&#xff0…

Ansible 基本使用

Ansible 清單 靜態主機清單 主機清單支持多種格式&#xff0c;例如ini、yaml、腳本等。 本次課程使用 ini 格式。 #創建主機清單[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4?#測試連接單個服務器[lykcontroller ~ 14:08:18]$ ansibl…

網絡資源模板--基于Android Studio 實現的九寨溝App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 首頁 購票頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也…

系統架構設計師備考之架構設計實踐知識

1.信息系統架構設計理論與實踐1.1.基本概念信息系統架構定義目前關于信息系統架構較為權威的定義有&#xff1a; &#xff08;1&#xff09;信息系統架構是系統的結構&#xff0c;由軟件元素、元素外部可見屬性和元素間關系組成。 &#xff08;2&#xff09;信息系統架構是軟件…

【IgH EtherCAT】如何利用 RTAI 提供的實時任務和調度機制來構建一個高精度、確定性的工業控制應用

SVG圖展示了系統的分層架構&#xff1a;RTAI實時層&#xff1a;包含RT_TASK、信號量和定時器EtherCAT Master層&#xff1a;主站、域、從站配置和PDO映射EtherCAT網絡層&#xff1a;與實際硬件設備&#xff08;EL3162模擬輸入、EL2004數字輸出&#xff09;通信關鍵特點&#xf…

7款熱門智能電視文件管理器橫向評測

7款智能電視文件管理器橫向評測 在智能電視和電視盒子日益普及的今天&#xff0c;一款好用的文件管理器能讓您的數字生活更加便捷。本文為您評測了7款廣受歡迎的TV版文件管理器&#xff0c;助您找到最適合自己的工具。 1. ES文件瀏覽器TV版 ES文件瀏覽器是一款廣受歡迎的多功能…

Python 類元編程(導入時和運行時比較)

導入時和運行時比較 為了正確地做元編程&#xff0c;你必須知道 Python 解釋器什么時候計算各個代碼 塊。Python 程序員會區分“導入時”和“運行時”&#xff0c;不過這兩個術語沒有嚴 格的定義&#xff0c;而且二者之間存在著灰色地帶。在導入時&#xff0c;解釋器會從上到 下…

[git diff] 對比檢查變更 | 提交前復審 | 版本回退

git diff git diff 是 Git 版本控制系統中用于比較文件差異的核心命令&#xff0c;可以顯示工作目錄、暫存區&#xff08;Index&#xff09;和倉庫歷史之間的變化。 通過對比不同版本或狀態的文件內容&#xff0c;幫助開發者理解代碼變更。 比較工作目錄與暫存區 運行以下命令查…

【數據可視化-85】海底撈門店數據分析與可視化:Python + pyecharts打造炫酷暗黑主題大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

物聯網之小白調試網關設備

小伙伴們&#xff0c;你們好呀&#xff01;我是老寇&#xff01;跟我一起學習調試網關設備 相信搞過物聯網的朋友&#xff0c;對網關設備非常熟悉&#xff0c;本人以小白的視角&#xff0c;手把手教你調試網關設備&#xff01; 工作中使用的是Ubuntu操作系統&#xff0c;因此&a…

Node.js特訓專欄-實戰進階:22. Docker容器化部署

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從Docker容器化部署的基礎概念入手,介紹Node.js應用容器化的步驟,包括創建Dockerfile、構建鏡像、運行…

eclipse嵌入式編譯速度慢

eclipse 嵌入式 編譯 速度慢 同一個項目&#xff0c;eclipse編譯速度越來越慢&#xff0c;一開始幾秒鐘編譯完&#xff0c;后面要10分鐘。只需要將以下兩個程序卸載重新安裝即可。

編譯Android版本可用的高版本iproute2

背景&#xff1a; Android自帶的iproute2 太老&#xff0c;很多指令格式不支持 直接基于Android源碼&#xff0c;替換源碼下iproute2 代碼編譯新版&#xff0c;報錯太多&#xff0c;于是改用Android NDK工具編譯 環境&#xff1a; android-ndk-r25c-linux.zip 下載鏈接&am…

JavaScript的fetch函數的用法

基本語法fetch函數用于發起網絡請求&#xff0c;返回一個Promise對象。基本語法如下&#xff1a;fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > console.error(Error:, error));GET請求發起一個簡單的GET請求&…

Json和XML文件相互轉化

目錄 一.XML轉Json文件 示例&#xff1a;將XML轉換為JSON 依賴準備 Java代碼示例 代碼詳細講解 二.Json轉XML文件 示例&#xff1a;將JSON轉換為XML 依賴準備 Java代碼示例 代碼詳細講解 關鍵代碼解析 將JSON轉換為XML 寫入文件 示例輸入與輸出 三.具有相同功能的…

Python科學計算與可視化領域工具TVTK、Mayavi、Mlab、Traits(附視頻教程)

概述 TVTK、Mayavi、Mlab 和 Traits 都是 Python 科學計算與可視化領域中緊密相關的工具&#xff0c;它們常被結合使用來處理和展示三維數據。視頻教程&#xff1a;https://pan.quark.cn/s/f73e875225ca 1. TVTK TVTK&#xff08;Traits-based Visualization Toolkit&#xff0…