Vision Master的C#腳本與opencv聯合編程

需要在VM的C#腳本設置string類型Out變量和float類型OutF變量,python的輸出信息會在Out變量顯示

using System;
using System.IO;
using Script.Methods;
using System.Diagnostics;
using System.Net.Sockets;
using System.Text;
using System.Threading;public partial class UserScript : ScriptMethods, IProcessMethods
{private PythonTcpRunner _pythonRunner;private Process _pythonProcess; // 保持進程引用public new int nErrorCode;private string pythonEdio=@"C:\T\python.exe";private string python= @"C:\T\清晰度評估.py";/// <summary>/// 初始化:啟動Python進程并建立TCP連接/// </summary>public void Init(){// 初始化TCP運行器(使用本地8888端口)_pythonRunner = new PythonTcpRunner(pythonEdio,python,"127.0.0.1",8888);// 啟動Python進程并等待TCP服務就緒string errorMsg;if (!_pythonRunner.StartProcess(out _pythonProcess, out errorMsg)){nErrorCode = -1;Out = "初始化Python進程失敗: " + errorMsg;}}/// <summary>/// 執行流程:通過TCP發送請求/// </summary>public bool Process(){try{// 檢查進程狀態if (_pythonProcess == null || _pythonProcess.HasExited){string errorMsg;if (!_pythonRunner.RestartProcess(out _pythonProcess, out errorMsg)){nErrorCode = -1;Out = "重啟Python進程失敗: " + errorMsg;return false;}}// 通過TCP發送執行請求string errorMessage;string outputMessage;bool success = _pythonRunner.SendRequest("EXECUTE", out errorMessage, out outputMessage, 5000);Out = string.IsNullOrWhiteSpace(outputMessage) ? errorMessage : outputMessage;// 嘗試將輸出轉換為float并賦值給OutFfloat result;if (!float.TryParse(outputMessage, out result)){// 如果轉換失敗,設置為NaN或其他默認值OutF = float.NaN;}else{OutF = result;}if (!success){nErrorCode = -2;return false;}nErrorCode = 0;return true;}catch (Exception ex){nErrorCode = -3;Out = string.Format("執行異常: {0}", ex.Message);return false;}}/// <summary>/// 釋放資源:關閉進程和連接,使用override關鍵字重寫基類方法/// </summary>public override void Dispose(){// 發送退出指令(修復輸出參數錯誤,兼容.NET 4.6)if (_pythonRunner != null){string dummyError;string dummyOutput;_pythonRunner.SendRequest("EXIT", out dummyError, out dummyOutput, 1000);}if (_pythonProcess != null && !_pythonProcess.HasExited){try{_pythonProcess.WaitForExit(2000);if (!_pythonProcess.HasExited)_pythonProcess.Kill();}catch { }finally{_pythonProcess.Dispose();_pythonProcess = null;}}// 關閉連接(兼容.NET 4.6)if (_pythonRunner != null){_pythonRunner.Close();}// 調用基類的Dispose方法base.Dispose();}
}/// <summary>
/// 基于TCP的Python運行器
/// </summary>
public class PythonTcpRunner
{private string _pythonPath;private string _scriptPath;private string _ip;private int _port;private TcpClient _client;public PythonTcpRunner(string pythonPath, string scriptPath, string ip, int port){_pythonPath = pythonPath;_scriptPath = scriptPath;_ip = ip;_port = port;}/// <summary>/// 啟動Python進程/// </summary>public bool StartProcess(out Process process, out string errorMessage){errorMessage = string.Empty;process = null;try{var startInfo = new ProcessStartInfo{FileName = _pythonPath,Arguments = string.Format("\"{0}\" {1} {2}", _scriptPath, _ip, _port),UseShellExecute = false,CreateNoWindow = true,WorkingDirectory = Path.GetDirectoryName(_scriptPath)};process = Process.Start(startInfo);if (process == null){errorMessage = "無法啟動Python進程";return false;}// 等待TCP服務啟動(最多等3秒)int retry = 0;while (retry < 30){try{_client = new TcpClient();var result = _client.BeginConnect(_ip, _port, null, null);var success = result.AsyncWaitHandle.WaitOne(100);if (success){_client.EndConnect(result);return true;}}catch { }retry++;Thread.Sleep(100);}errorMessage = "Python TCP服務啟動超時";process.Kill();return false;}catch (Exception ex){errorMessage = ex.Message;return false;}}/// <summary>/// 重啟進程/// </summary>public bool RestartProcess(out Process process, out string errorMessage){Close();return StartProcess(out process, out errorMessage);}/// <summary>/// 發送TCP請求/// </summary>public bool SendRequest(string command, out string errorMessage, out string outputMessage, int timeout){errorMessage = string.Empty;outputMessage = string.Empty;try{if (_client == null || !_client.Connected){errorMessage = "TCP連接已斷開";return false;}var stream = _client.GetStream();stream.ReadTimeout = timeout;stream.WriteTimeout = timeout;// 發送指令(UTF8編碼,以換行符結束)byte[] data = Encoding.UTF8.GetBytes(command + "\n");stream.Write(data, 0, data.Length);// 讀取響應(直到收到結束標記)using (var ms = new MemoryStream()){byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0){ms.Write(buffer, 0, bytesRead);// 檢查是否包含結束標記string temp = Encoding.UTF8.GetString(ms.ToArray());if (temp.Contains("\nEOF\n")){outputMessage = temp.Replace("\nEOF\n", "").Trim();return true;}}}errorMessage = "未收到完整響應";return false;}catch (Exception ex){errorMessage = ex.Message;return false;}}/// <summary>/// 關閉連接/// </summary>public void Close(){try{if (_client != null){_client.Close();}}catch { }_client = null;}
}
import sys
import time
import socket# 簡單的數字運算函數
def simple_calculation(input_num):result = (input_num ** 2) + (input_num * 1.5) - 42time.sleep(0.1)return round(result, 2)# 簡化的TCP服務器
class SimpleServer:def __init__(self, host, port):self.host = hostself.port = portself.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server_socket.bind((host, port))self.server_socket.listen(1)self.running = Trueself.client_socket = Noneself.test_numbers = [12, 34, 56, 78, 90]def handle_client(self):while self.running and self.client_socket:try:data = self.client_socket.recv(1024).decode('utf-8').strip()if not data:breakif data == "EXECUTE":result = self.process_numbers()self.client_socket.sendall((result + "\nEOF\n").encode('utf-8'))elif data == "EXIT":self.running = Falseself.client_socket.sendall("已退出\nEOF\n".encode('utf-8'))breakelse:self.client_socket.sendall(("未知指令\nEOF\n").encode('utf-8'))except Exception as e:error_msg = f"處理請求出錯: {str(e)}\nEOF\n"self.client_socket.sendall(error_msg.encode('utf-8'))breakdef process_numbers(self):total_start = time.perf_counter()results = []for num in self.test_numbers:try:result = simple_calculation(num)results.append(f"數字 {num} 的計算結果: {result}")except Exception as e:results.append(f"錯誤: {str(e)}")total_elapsed = time.perf_counter() - total_startresults.append(f"\n總處理時間: {total_elapsed:.4f}秒")return "\n".join(results)def start(self):print(f"TCP服務器啟動在 {self.host}:{self.port}")try:self.client_socket, addr = self.server_socket.accept()print(f"客戶端 {addr} 已連接")self.handle_client()finally:self.stop()def stop(self):if self.client_socket:self.client_socket.close()self.server_socket.close()print("服務器已停止")if __name__ == "__main__":if len(sys.argv) != 3:print("用法: python simple_server.py [host] [port]")sys.exit(1)host = sys.argv[1]port = int(sys.argv[2])server = SimpleServer(host, port)try:server.start()except KeyboardInterrupt:server.stop()sys.exit(0)

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

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

相關文章

運維工作架構流程搭建

前言 在解決了運維是干什么的&#xff0c;運維的工作的意義后&#xff0c;這一章我們系統性的講講運維工作流程搭建&#xff0c;希望大家能通過我的分享有所收獲&#xff0c;這一章干貨滿滿。 一、網絡服務器架構 按照一般的訪問方式&#xff0c;按照我自己的理解畫了一個網絡服…

安全存儲之 SAES+HUK 使用技巧和常見問題 LAT1543

關鍵字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存儲 引言 近年來&#xff0c;嵌入式設備信息安全被越來越多地提及&#xff0c;從智能穿戴產品、智能工業設備到物聯網產品都對設備信息安全提出了要求&#xff0c;比如基礎的安全啟動&#xff0c;安全升級&#xff0…

ubuntu 20.04 搭建多用戶遠程桌面共享及同時在線使用

使用效果: 物理機: 遠程桌面用戶: 實現過程: 1.使用腳本安裝xrdp并修改配置及啟動服務 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…

[激光原理與應用-287]:理論 - 波動光學 - 電磁波既能承載能量,又能承載信息?

電磁波既能承載能量&#xff0c;又能承載信息&#xff0c;這一特性源于其物理本質和調制技術的結合。以下從能量承載和信息承載兩方面進行詳細解析&#xff1a;一、電磁波如何承載能量&#xff1f;電磁波的能量承載源于其電場和磁場的周期性振蕩&#xff0c;具體機制如下&#…

哪里找最新AI工具官網?如何快速對比ChatGPT替代品?AI工具導航指南 - AIbase

你是否曾有這樣的經歷&#xff1a; 聽聞某款新AI工具爆火&#xff0c;翻遍網絡卻找不到可靠官網或真實評測&#xff1f; 面對功能相似的ChatGPT替代品&#xff0c;參數對比表格散落各處&#xff0c;決策耗時耗力&#xff1f; 想緊跟AI領域突破&#xff0c;卻淹沒在海量資訊碎…

第一階段C#基礎-15:面向對象梳理

面向對象對象三&#xff08;四&#xff09;大特征&#xff1a;封裝&#xff0c;繼承&#xff0c;多態&#xff0c;&#xff08;抽象&#xff09;1_封裝&#xff08;1&#xff09;封裝是指將數據&#xff08;屬性&#xff09;和行為&#xff08;方法&#xff09;組合在一個類中&…

中國星網發展情況全面分析

中國星網作為我國衛星互聯網領域的"國家隊"先鋒,自2021年4月成立以來已取得顯著進展。截至2025年8月,中國星網主導的GW星座已累計發射73顆衛星,形成"四天兩發"的高頻發射節奏,標志著我國低軌衛星互聯網建設進入加速期。在戰略定位上,中國星網不僅承擔…

C++ Qt 成員對象初始化與 TCP 長連接問題深度解析

文章目錄C Qt 成員對象初始化與 TCP 長連接問題深度解析1. 棧對象、堆對象與類成員對象的區別1.1 棧對象&#xff08;局部變量&#xff09;1.2 堆對象&#xff08;動態分配&#xff09;1.3 類成員對象1.4 棧對象 vs 成員對象 vs 堆對象對比表2. 為什么初始化列表必須用2.1 構造…

深度學習周報(8.11~8.17)

目錄 摘要 Abstract 1 CNN--卷積神經網絡簡介 2 CNN核心操作 2.1 卷積 2.2 池化 3 總結 摘要 本周主要學習了卷積神經網絡&#xff08;CNN&#xff09;的相關知識&#xff0c;包括概念、基本架構與應用領域等知識&#xff0c;了解了CNN利用其結構高效地從圖像等網格化數…

oracle dg duplicate限速

一些客戶在搭建dg的時候需要進行限速&#xff0c;不然對生產庫的影響比較大&#xff0c;例如將速度限制到200M每秒&#xff0c;語法如下&#xff1a;rman target sys/XXXX auxiliary sys/XXXXdg <<EOF run{ allocate channel d1 type disk rate 200M; allocate auxiliar…

飛算JavaAI智慧校園場景實踐:從校園管理到師生服務的全鏈路技術革新

目錄一、智慧校園核心場景的技術突破1.1 智能校園綜合管理系統1.2 智慧教學資源共享系統1.3 校園生活服務集成系統二、智慧校園系統效能升級實踐結語&#xff1a;重新定義智慧校園技術邊界在校園管理領域&#xff0c;“規模化運營”與“個性化服務”的矛盾、“管理效率”與“服…

PTPX分析中,如何處理fsdb文件過大的問題?

PTPX分析中&#xff0c;如何處理fsdb文件過大的問題&#xff1f;摘要&#xff1a;下面將基于Synopsys工具鏈&#xff08;PrimeTime PX&#xff0c;即PTPX&#xff0c;用于功耗分析&#xff1b;Verdi&#xff0c;用于波形查看&#xff09;逐一解答每個部分。這些工具在SoC功耗驗…

004.Redis 數據持久化概述及實戰

文章目錄Redis持久化說明Redis持久化RDB持久化AOF持久化混合持久化save與bgsaveRedis RDB持久化Redis 安裝Redis RDB配置手動觸發RDB持久化模擬寫入測試數據模擬進程異常RDB的優缺點優勢劣勢Redis AOF持久化Redis 安裝Redis AOF配置AOF持久化模擬寫入測試數據模擬進程異常AOF的…

Kubernetes(K8s)常用命令全解析:從基礎到進階

Kubernetes&#xff08;K8s&#xff09;常用命令全解析&#xff1a;從基礎到進階 引言&#xff1a;為什么掌握K8s命令是云原生時代的必備技能&#xff1f; Kubernetes&#xff08;簡稱K8s&#xff09;作為容器編排的事實標準&#xff0c;已成為云原生應用部署、擴展和管理的核…

深入解析StatefulSet與K8s服務管理

目錄 一、Statefulset控制器&#xff1a;概念、原理解讀 有狀態服務 無狀態服務 StatefulSet部分組成 Headless service 二、Statefulset資源清單文件編寫技巧 三、Statefulset使用案例&#xff1a;部署web站點 四、Statefulset管理pod&#xff1a;擴容、縮容、更新 St…

GaussDB常用術語縮寫及釋義

序號 術語全稱釋義1ACLAccess Control List訪問控制列表&#xff0c;被授權訪問某一資源的實體及其訪問權限的列表。2APIApplication Programming Interface應用程序接口&#xff0c;一些預先定義的接口&#xff08;如函數&#xff0c;http接口&#xff09;或指軟件系統不同組…

工業一體機5G通訊IC/ID刷卡讓MES系統管理更智能

在智能制造升級過程中&#xff0c;MES 系統作為生產執行的核心樞紐&#xff0c;其數據采集的實時性、準確性與管理安全性直接決定管理效能。傳統 MES 系統常面臨數據傳輸滯后、設備對接繁瑣、權限管理粗放等問題&#xff0c;而工業一體機憑借 5G 通訊與 IC/ID 刷卡功能&#xf…

電腦開機幾秒后就停止然后再循環是怎么回事

硬件問題電源問題&#xff1a;電源內部的濾波電容若出現鼓包或漏液現象&#xff0c;會導致電源供電不足&#xff0c;從而使電腦開機后自動停止并重新啟動。另外&#xff0c;電源線連接不良、插座無電或電源供應器故障&#xff0c;也可能引發此問題。CPU 散熱問題&#xff1a;如…

OSCP - Proving Grounds - Vanity

主要知識點Linux命令注入rsync 腳本劫持(以前tar 備份腳本劫持也是利用了類似的方法&#xff09;具體步驟nmap掃描結果&#xff0c;發現web服務開放&#xff0c;并且 rsync服務開放&#xff0c;值得研究一下Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-30 14:37 UT…

詳細探討AI在金融、醫療、教育和制造業四大領域的具體落地案例,并通過代碼、流程圖、Prompt示例和圖表等方式展示這些應用的實際效果。

1. 引言&#xff1a;AI技術概述及其在各行業的重要性人工智能(AI)技術近年來取得了突破性進展&#xff0c;從理論研究走向了廣泛的商業應用。AI的核心技術包括機器學習、深度學習、自然語言處理、計算機視覺等&#xff0c;這些技術正在深刻改變各行各業的運營模式和服務方式。在…