機器學習 YOLOv5手繪電路圖識別 手繪電路圖自動轉換為仿真軟件(如LT Spice)可用的原理圖,避免人工重繪

以下是對《手繪電路圖識別》論文的核心解讀,結合技術方案、實驗數據和創新點進行結構化總結:


研究目標

解決痛點:將手繪電路圖自動轉換為仿真軟件(如LT Spice)可用的原理圖,避免人工重繪。
關鍵挑戰:元件識別 + 節點連接追蹤,需兼容手繪風格差異、紙張/光照噪聲。


技術方案

1. 元件檢測(深度學習)
  • 模型:YOLOv5(輕量級實時目標檢測)
  • 優勢
    • 直接處理原始掃描圖(無需形態學預處理,避免傳統方法導致的圖像腐蝕)。
    • 訓練數據增強(旋轉/翻轉),388張圖像訓練。
  • 輸出:元件類別 + 邊界框(Bounding Box)。
2. 節點識別(傳統圖像處理)
  • 步驟
    1. 終端提取:基于邊界框位置生成二值掩膜 + 自適應閾值分割(兼容光照變化)。
    2. 連線分離:移除元件區域,保留連接線。
    3. 節點定位
      • Hough變換檢測線段 → 按斜率分類水平/垂直線(斜率45°~135°為垂直線)。
      • 求線段交點 → 篩選有效節點(交點需位于線段端點間)。
      • K-means聚類精確定位節點坐標(解決交點區域擴散問題)。
3. 原理圖重建
  • 映射邏輯
    • 元件端子 → 最近鄰節點(距離優先)。
    • 孤立節點 → 相互連接(需至少連接兩個端子)。
  • 偽代碼核心:遍歷端子,計算與所有節點的歐氏距離,分配至最近節點。

實驗結果

1. 元件檢測性能(YOLOv5最優)
模型mAP@0.5 (%)推理時間 (秒)
YOLOv598.20.027
YOLOv398.10.052
SSD30092.50.051
  • 元件分類準確率:電壓源/二極管≈100%,電感/電阻≈98%(形狀相似導致輕微混淆)。
2. 整體系統性能
任務準確率耗時
元件檢測99%-
節點識別92%-
全電路重建80%0.33s
  • 測試集:51張手繪圖(5人繪制),41張成功重建。

創新點

  1. 端到端流程:首個結合目標檢測(YOLOv5)與節點識別(Hough變換 + K-means)的實時方案。
  2. 抗干擾能力:自適應閾值 + 直接原始圖像處理,避免傳統細化(Thinning)操作的圖像退化問題。
  3. 速度優勢:0.33秒/圖的近實時性能(傳統方法需復雜預處理)。

局限與未來方向

  1. 當前限制
    • 僅支持單支路單元件(如并聯電阻需分多支路繪制)。
    • 距離映射法對非規范繪圖敏感(如交叉線)。
  2. 改進方向
    • 擴展元件類別(晶體管、邏輯門等)。
    • 用神經網絡替代傳統節點識別(實現全深度學習流程)。
    • 公開數據集促進研究(當前為自建154張圖)。

橫向對比

方法元件識別 (%)節點識別 (%)關鍵技術
本文 (YOLOv5)9992目標檢測 + Hough變換
Edwards [9]8692形態學細化 + 句法分析
Dey [1]97.33-兩階段CNN分類(僅元件)

總結:本文在元件檢測精度(99% vs 86%)和抗干擾性上顯著優于傳統方法,首次實現近實時的端到端電路重建。


附:核心流程圖

手繪電路掃描圖
YOLOv5元件檢測
提取邊界框 + 類別
自適應閾值分割
生成端子掩膜
分離連線 + Hough變換檢測線段
計算交點 + K-means聚類節點
端子-節點距離映射
生成原理圖

一段話總結:本文提出了一種基于目標檢測(YOLOv5)和節點識別(霍夫變換) 的實時手繪電路圖識別算法,可自動重建電路 schematic。該算法使用YOLOv5檢測電路元件,實現了98.2%的mAP 0.5;通過霍夫變換和k-means聚類進行節點識別,結合距離匹配算法完成元件與節點的連接映射,最終電路重建準確率達80%,實時性能為0.33秒/張。實驗基于自定義數據集(154張手繪電路圖像,增強后388張用于訓練),對比YOLOv3、SSD300后發現YOLOv5在速度(0.027秒)和綜合性能上更優,且該方法是首個端到端實時從手繪電路生成可用于仿真的schematic的研究。


思維導圖

## **研究背景**
- 手繪電路需數字化以用于仿真,但現有研究多聚焦元件分類,缺乏端到端重建方法
- 挑戰:手繪風格差異、圖像質量、噪聲等
## **提出方法**
- 元件檢測:對比YOLOv5、YOLOv3、SSD300,選YOLOv5(輕量、快速)
- 終端識別:結合邊界框與自適應閾值二值化圖像,k-means聚類求終端中心
- 節點識別:移除元件后用霍夫變換檢測線,通過斜率分水平/垂直線,求交點為節點,k-means精確定位
- 電路schematic生成:基于距離匹配終端與節點,節點間補充連接
## **數據集**
- 自定義:154張手繪電路(含電壓源、電阻等5類元件)
- 劃分:103張訓練,51張測試;數據增強后388張訓練
## **實驗結果**
- 性能對比:YOLOv5 mAP 0.5 98.1%,耗時0.027s,綜合指標最優
- 電路重建:準確率80%,平均推理時間0.33s
- 與現有方法:首個用目標檢測實現端到端重建,元件識別準確率99%優于Edwards等(86%)
## **局限性與未來工作**
- 局限:單分支僅含1元件、依賴距離匹配易出錯、受手繪風格和圖像條件影響
- 未來:擴展元件類型、優化匹配算法、提升抗干擾性

詳細總結

1. 引言

  • 研究背景:手繪電路需手動轉化為仿真軟件可用的schematic,現有研究多聚焦文本數字化,電路數字化研究較少,因此自動轉化具有重要價值。
  • 核心挑戰:手繪風格差異、圖像質量(紙張、墨水、噪聲)等導致識別難度大。
  • 研究目標:提出實時算法,實現手繪電路到可仿真schematic的自動轉化,涵蓋元件檢測、連接追蹤。

2. 相關工作

  • 現有研究多聚焦元件分類,如:
    • Dey等(201)用兩階段CNN分類20類元件,準確率97.33%;
    • Roy等(2020)結合HOG特征與SMO分類器,準確率93.63%;
    • 少數涉及連接追蹤,如Edwards等(2000)節點識別準確率92%,元件識別86%,但依賴圖像 thinning 操作,易導致線條斷裂。
  • 現有方法局限:缺乏端到端電路重建,未使用目標檢測算法。

3. 提出方法

3.1 電路元件檢測
  • 采用目標檢測算法(YOLOv5、YOLOv3、SSD300),實現元件分類與定位。
  • 對比分析:
    • YOLOv5:基于CSPNet特征提取,PANet特征金字塔,速度快(0.027s);
    • YOLOv3:基于Darknet-53,106層卷積,速度較慢(0.052s);
    • SSD300:輸入分辨率300×300,性能較差(mAP 0.5 92.5%)。
3.2 終端識別
  • 步驟:生成邊界框二值化圖像與自適應閾值二值化圖像,求交集;用k-means聚類(質心數為元件數的2倍)確定終端中心。
  • 自適應閾值公式:根據區域高斯加權和減常數C確定閾值,應對光照變化。
3.3 節點識別
  • 步驟:移除元件區域(邊界框內設為白像素);霍夫變換檢測線條,按斜率(>45°且<135°為豎線,<45°或>135°為橫線)分割;求線交點,通過輪廓檢測和k-means確定節點坐標。
  • 交點約束:需位于線段內,避免誤檢。
3.4 電路schematic生成
  • 基于距離匹配:終端連接最近節點,節點間連接(少于2個終端的節點),完成電路重建。

4. 結果與評估

4.1 數據集
  • 自定義:154張手繪電路(5人繪制,含電壓源、電阻、電容、電感、二極管);
  • 劃分:103張訓練,51張測試;數據增強(旋轉、翻轉)后388張訓練。
4.2 訓練方法
  • 框架:PyTorch;
  • 參數:YOLOv5/YOLOv3輸入416×416,學習率0.001,動量0.937,批次16,epoch 500;SSD300輸入300×300,學習率0.001,動量0.9,批次8,epoch 1500。
4.3 性能指標
模型mAP 0.5(%)平均準確率(%)平均召回率(%)平均F1-score(%)耗時(秒)
YOLOv598.199.1798.7598.400.0270
YOLOv398.198.6297.0197.620.0520
SSD30092.598.2095.9196.970.0515
  • 電路重建:51張測試圖中41張成功,準確率80%;平均推理時間0.33秒。
4.4 與現有方法對比
方法元件識別準確率(%)節點識別準確率(%)特點
Edwards等(2000)8692依賴thinning操作,易斷線
本文方法9992首個端到端目標檢測方法,無需thinning

5. 局限性與結論

  • 局限性:單分支僅含1元件、距離匹配易出錯、受手繪風格和圖像條件影響。
  • 結論:該方法實現了手繪電路到schematic的實時重建,YOLOv5性能最優,為電路數字化提供新方案。

關鍵問題

  1. 問題:該研究中三種目標檢測算法(YOLOv5、YOLOv3、SSD300)的核心差異的是什么?哪種更適合手繪電路元件檢測?
    答案:核心差異體現在架構、速度和性能上。YOLOv5基于CSPNet和PANet,速度最快(0.027秒),綜合指標最優(平均F1-score 98.40%);YOLOv3基于Darknet-53,速度較慢(0.052秒);SSD300輸入分辨率低,性能最差(mAP 0.5 92.5%)。YOLOv5更適合,因其兼顧速度與精度,滿足實時應用需求。

  2. 問題:該研究的節點識別流程是怎樣的?如何確保節點識別的準確性?
    答案:流程為:①移除元件區域(邊界框內設為白像素);②霍夫變換檢測線條,按斜率分水平/豎線;③計算線交點,篩選位于線段內的交點;④通過輪廓檢測和k-means聚類確定節點坐標。準確性保障措施包括:限制交點必須位于線段內、對交點進行膨脹處理減少間隙影響、用k-means精確定位節點。

  3. 問題:與現有研究相比,該方法的創新點和優勢是什么?
    答案:創新點:①首個采用目標檢測算法(而非僅分類)處理手繪電路識別;②提出端到端流程,實現從手繪圖像到電路schematic的完整重建;③結合YOLOv5與霍夫變換,兼顧速度與精度。優勢:①元件檢測準確率更高(99% vs 現有最高86%);②無需依賴圖像thinning操作,避免線條斷裂問題;③實時性能優異(0.33秒/張),可用于實際應用。

以下是一個簡化的Python代碼框架,實現手繪電路圖識別的核心流程。實際部署需要結合YOLOv5模型和OpenCV等庫,并準備訓練數據。

import cv2
import numpy as np
import torch
from yolov5 import YOLOv5  # 需安裝yolov5庫
from sklearn.cluster import KMeansclass CircuitRecognizer:def __init__(self, model_path='circuit_yolov5.pt'):# 加載預訓練的YOLOv5模型self.model = YOLOv5(model_path)self.component_classes = ['resistor', 'capacitor', 'inductor', 'diode', 'voltage_source']def detect_components(self, img_path):"""使用YOLOv5檢測電路元件"""results = self.model.predict(img_path)detections = []for result in results.pred[0]:x1, y1, x2, y2, conf, cls = result[:6]detections.append({'bbox': [x1, y1, x2, y2],'class': self.component_classes[int(cls)],'confidence': float(conf)})return detectionsdef adaptive_threshold(self, img):"""自適應閾值處理"""gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)return cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)def extract_terminals(self, img, detections):"""提取元件端子位置"""# 步驟1:創建元件掩膜mask = np.zeros(img.shape[:2], dtype=np.uint8)for det in detections:x1, y1, x2, y2 = map(int, det['bbox'])cv2.rectangle(mask, (x1, y1), (x2, y2), 255, -1)# 步驟2:自適應閾值處理binary = self.adaptive_threshold(img)# 步驟3:分離連接線wires = cv2.bitwise_and(binary, cv2.bitwise_not(mask))return wiresdef detect_nodes(self, wires_img):"""使用Hough變換和聚類檢測節點"""# 檢測線段lines = cv2.HoughLinesP(wires_img, 1, np.pi/180, 50, minLineLength=50, maxLineGap=10)# 分離水平和垂直線horizontal, vertical = [], []for line in lines:x1, y1, x2, y2 = line[0]angle = np.abs(np.arctan2(y2-y1, x2-x1) * 180 / np.pi)if 45 < angle < 135:vertical.append([(x1, y1), (x2, y2)])else:horizontal.append([(x1, y1), (x2, y2)])# 計算交點intersections = []for h_line in horizontal:for v_line in vertical:# 計算交點 (使用向量方法)x, y = self.line_intersection(h_line, v_line)if x is not None:intersections.append([x, y])# K-means聚類精確定位節點if intersections:kmeans = KMeans(n_clusters=min(10, len(intersections)))kmeans.fit(intersections)return kmeans.cluster_centers_return []def line_intersection(self, line1, line2):"""計算兩線段交點"""# 向量計算方法 (實現公式5)# ... (此處省略具體實現)return x, ydef generate_schematic(self, detections, nodes):"""生成電路原理圖(簡化版)"""# 步驟1:提取元件端子坐標terminals = []for det in detections:x1, y1, x2, y2 = det['bbox']# 假設端子位于邊界框左右中點terminals.append(((x1, (y1+y2)/2), det['class'] + '_1'))terminals.append(((x2, (y1+y2)/2), det['class'] + '_2'))# 步驟2:端子-節點映射(最近鄰)connections = {}for terminal_pos, terminal_id in terminals:min_dist = float('inf')closest_node = Nonefor node in nodes:dist = np.linalg.norm(np.array(terminal_pos) - np.array(node))if dist < min_dist:min_dist = distclosest_node = tuple(node)if closest_node not in connections:connections[closest_node] = []connections[closest_node].append(terminal_id)# 步驟3:構建網絡表netlist = {}for node, terms in connections.items():if len(terms) >= 2:  # 有效節點需連接至少兩個端子net_id = f"net{len(netlist)+1}"netlist[net_id] = termsreturn netlistdef process_circuit(self, img_path):"""端到端處理流程"""# 1. 元件檢測img = cv2.imread(img_path)detections = self.detect_components(img_path)# 2. 節點識別wires_img = self.extract_terminals(img, detections)nodes = self.detect_nodes(wires_img)# 3. 生成原理圖schematic = self.generate_schematic(detections, nodes)return {'detections': detections,'nodes': nodes,'schematic': schematic}# 使用示例
if __name__ == "__main__":recognizer = CircuitRecognizer()result = recognizer.process_circuit("hand_drawn_circuit.jpg")print("檢測到的元件:")for det in result['detections']:print(f"- {det['class']} (置信度: {det['confidence']:.2f})")print("\n檢測到的節點:", result['nodes'])print("\n生成的網絡表:")for net, components in result['schematic'].items():print(f"{net}: {', '.join(components)}")

關鍵依賴庫安裝:

pip install opencv-python numpy torch scikit-learn
git clone https://github.com/ultralytics/yolov5  # 下載YOLOv5
pip install -r yolov5/requirements.txt

實現說明:

  1. 元件檢測

    • 使用YOLOv5模型(需預先訓練)
    • 輸出元件類別和邊界框
  2. 節點識別流程

    原始圖像
    自適應閾值處理
    生成元件掩膜
    提取連接線
    Hough變換檢測線段
    分類水平/垂直線
    計算交點
    K-means聚類節點
  3. 原理圖生成

    • 基于最近鄰距離映射端子到節點
    • 構建網絡表(Netlist)表示連接關系

訓練YOLOv5模型:

  1. 準備數據集:

    • 收集手繪電路圖(約150+張)
    • 使用LabelImg標注元件邊界框
    • 數據增強(旋轉、翻轉等)
  2. 訓練命令:

python yolov5/train.py --img 416 --batch 16 --epochs 500 \--data circuit.yaml --weights yolov5s.pt

優化建議:

  1. 端子定位改進

    def get_component_terminals(bbox, component_type):"""根據元件類型定位端子"""if component_type == 'resistor':# 電阻端子位于左右邊界中點return [left_center, right_center]elif component_type == 'capacitor':# 電容端子位于上下邊界中點return [top_center, bottom_center]# ...
    
  2. 節點識別增強

    • 添加曲線檢測(使用概率Hough變換)
    • 引入線段連接性分析
    • 使用形態學操作填充小間隙
  3. 輸出格式

    • 支持SPICE網表導出
    • 生成可視化原理圖(使用Schematics庫)

此代碼提供了核心框架,實際部署需根據具體電路特性調整參數和處理邏輯。

或者

以下是手繪電路圖識別算法的完整Python實現。這個代碼結合了YOLOv5進行元件檢測和傳統計算機視覺方法進行終端、節點識別,實現了從手繪電路圖像到可仿真電路原理圖的轉換。

import cv2
import numpy as np
import torch
from PIL import Image
from yolov5.models.common import DetectMultiBackend
from yolov5.utils.general import non_max_suppression, scale_boxes
from yolov5.utils.torch_utils import select_device
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansclass CircuitRecognizer:def __init__(self, weights_path='yolov5s.pt', device='', conf_thres=0.5, iou_thres=0.45):# 初始化YOLOv5模型用于元件檢測self.device = select_device(device)self.model = DetectMultiBackend(weights_path, device=self.device, dnn=False, data=None)self.stride, self.names, self.pt = self.model.stride, self.model.names, self.model.ptself.conf_thres = conf_thresself.iou_thres = iou_thresdef detect_components(self, img_path):"""檢測電路元件"""# 加載圖像img = cv2.imread(img_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)im = Image.fromarray(img)# 預處理圖像im = self.model.preprocess(im)im = im.to(self.device)im = im.half() if self.model.fp16 else im.float()  # uint8 to fp16/32im /= 255  # 0 - 255 to 0.0 - 1.0if len(im.shape) == 3:im = im[None]  # expand for batch dim# 模型推理pred = self.model(im)pred = non_max_suppression(pred, self.conf_thres, self.iou_thres, classes=None, agnostic=False)# 處理檢測結果components = []im0 = img.copy()for i, det in enumerate(pred):  # per imageif len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_boxes(im.shape[2:], det[:, :4], im0.shape).round()# 保存檢測到的元件for *xyxy, conf, cls in reversed(det):x1, y1, x2, y2 = map(int, xyxy)components.append({'class': self.names[int(cls)],'confidence': float(conf),'bbox': (x1, y1, x2, y2)})return components, imgdef identify_terminals(self, img, components):"""識別元件終端"""terminals = []for comp in components:x1, y1, x2, y2 = comp['bbox']# 提取元件區域comp_img = img[y1:y2, x1:x2]# 轉換為灰度圖并進行二值化gray = cv2.cvtColor(comp_img, cv2.COLOR_RGB2GRAY)_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 計算輪廓contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 計算終端點(簡化版,實際應用中可能需要更復雜的算法)if contours:# 找到最大的輪廓largest_contour = max(contours, key=lambda c: cv2.contourArea(c))# 計算輪廓的矩M = cv2.moments(largest_contour)# 計算中心點if M["m00"] != 0:cx = int(M["m10"] / M["m00"])cy = int(M["m01"] / M["m00"])# 將坐標轉換回原圖terminals.append({'component': comp['class'],'x': x1 + cx,'y': y1 + cy})return terminalsdef identify_nodes(self, img, components):"""識別電路圖中的節點"""# 創建一個掩碼,移除元件區域mask = np.ones(img.shape[:2], dtype=np.uint8) * 255for comp in components:x1, y1, x2, y2 = comp['bbox']mask[y1:y2, x1:x2] = 0# 對原圖應用掩碼masked_img = cv2.bitwise_and(img, img, mask=mask)# 轉換為灰度圖并進行邊緣檢測gray = cv2.cvtColor(masked_img, cv2.COLOR_RGB2GRAY)edges = cv2.Canny(gray, 50, 150, apertureSize=3)# 使用霍夫變換檢測線條lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=50, maxLineGap=10)# 分類線條為水平和垂直horizontal_lines = []vertical_lines = []if lines is not None:for line in lines:x1, y1, x2, y2 = line[0]if abs(y2 - y1) < abs(x2 - x1):  # 水平線條horizontal_lines.append((x1, y1, x2, y2))else:  # 垂直線條vertical_lines.append((x1, y1, x2, y2))# 計算線條交點intersections = []for h_line in horizontal_lines:for v_line in vertical_lines:x1h, y1h, x2h, y2h = h_linex1v, y1v, x2v, y2v = v_line# 計算交點x = x1vy = y1h# 檢查交點是否在線段上if (x >= min(x1h, x2h) and x <= max(x1h, x2h) andy >= min(y1v, y2v) and y <= max(y1v, y2v)):intersections.append((x, y))# 使用K-means聚類精確定位節點if intersections:X = np.array(intersections)kmeans = KMeans(n_clusters=min(10, len(intersections)), random_state=0).fit(X)nodes = kmeans.cluster_centers_.astype(int)return [{'x': x, 'y': y} for x, y in nodes]else:return []def build_circuit_schematic(self, components, terminals, nodes):"""構建電路原理圖"""# 簡化版:基于距離匹配終端和節點connections = []for terminal in terminals:min_dist = float('inf')closest_node = Nonefor node in nodes:dist = np.sqrt((terminal['x'] - node['x'])**2 + (terminal['y'] - node['y'])**2)if dist < min_dist:min_dist = distclosest_node = nodeif closest_node and min_dist < 50:  # 設置距離閾值connections.append({'terminal': terminal,'node': closest_node})# 構建節點間的連接node_connections = []for i, node1 in enumerate(nodes):for j, node2 in enumerate(nodes):if i < j:# 檢查是否有足夠的終端連接到這兩個節點node1_terminals = [conn['terminal'] for conn in connections if conn['node'] == node1]node2_terminals = [conn['terminal'] for conn in connections if conn['node'] == node2]if len(node1_terminals) >= 1 and len(node2_terminals) >= 1:node_connections.append({'node1': node1,'node2': node2})return {'components': components,'terminals': terminals,'nodes': nodes,'connections': connections,'node_connections': node_connections}def visualize_results(self, img, schematic):"""可視化識別結果"""result = img.copy()# 繪制元件邊界框for comp in schematic['components']:x1, y1, x2, y2 = comp['bbox']cv2.rectangle(result, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(result, f"{comp['class']}: {comp['confidence']:.2f}", (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 繪制終端點for term in schematic['terminals']:cv2.circle(result, (term['x'], term['y']), 5, (0, 0, 255), -1)# 繪制節點for node in schematic['nodes']:cv2.circle(result, (node['x'], node['y']), 8, (255, 0, 0), -1)# 繪制連接for conn in schematic['connections']:term = conn['terminal']node = conn['node']cv2.line(result, (term['x'], term['y']), (node['x'], node['y']), (255, 255, 0), 2)# 繪制節點間連接for conn in schematic['node_connections']:node1 = conn['node1']node2 = conn['node2']cv2.line(result, (node1['x'], node1['y']), (node2['x'], node2['y']), (255, 0, 255), 2)return result# 使用示例
def main():# 初始化識別器recognizer = CircuitRecognizer(weights_path='path/to/your/yolov5_model.pt')# 檢測元件components, img = recognizer.detect_components('hand_drawn_circuit.jpg')# 識別終端terminals = recognizer.identify_terminals(img, components)# 識別節點nodes = recognizer.identify_nodes(img, components)# 構建電路原理圖schematic = recognizer.build_circuit_schematic(components, terminals, nodes)# 可視化結果result = recognizer.visualize_results(img, schematic)# 顯示結果plt.figure(figsize=(10, 10))plt.imshow(result)plt.axis('off')plt.show()# 保存結果cv2.imwrite('recognized_circuit.jpg', cv2.cvtColor(result, cv2.COLOR_RGB2BGR))if __name__ == "__main__":main()

這個代碼實現了論文中描述的手繪電路圖識別算法的主要功能:

  1. 元件檢測:使用預訓練的YOLOv5模型識別電路圖中的各種元件
  2. 終端識別:定位每個元件的連接端點
  3. 節點識別:通過霍夫變換檢測連接線并識別連接節點
  4. 電路原理圖構建:基于距離匹配算法建立元件、終端和節點之間的連接關系
  5. 結果可視化:在原圖上繪制識別結果,包括元件邊界框、終端點、節點和連接線

使用前需要準備好訓練好的YOLOv5模型權重文件,并確保安裝了必要的依賴庫。代碼中的參數(如距離閾值、霍夫變換參數等)可能需要根據實際應用場景進行調整。

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

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

相關文章

一般的非線性規劃求解(非凸函數)

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 每一個裂縫都是為透出光而努力&#x…

CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}

Web 信息泄露 Git泄露 Stash 首先&#xff0c;我們先讀題&#xff0c;由題可知我們可以用BugScanTeam或GitHack完成該題那么我們先開題&#xff0c; 好吧&#xff0c;他問我們flag在哪里&#xff0c;我怎么知道fag在哪里。 先打開GitHack 使用 py GitHack.py http://challenge-…

缺乏實際里程碑管控項目進度,如何設定關鍵節點

要通過實際里程碑管控項目進度&#xff0c;核心措施包括&#xff1a;設定可量化的關鍵節點、明確交付標準與責任人、同步風險與資源計劃、基于階段目標拆解任務、建立節點驗證與復盤機制。例如&#xff0c;設定可量化的關鍵節點能讓團隊清晰理解“何時完成了什么”并及時調整方…

XML E4X:深入解析與高效應用

XML E4X:深入解析與高效應用 引言 XML(可擴展標記語言)作為一種數據交換格式,廣泛應用于互聯網數據傳輸、配置文件、數據存儲等領域。E4X 是一種擴展 XML 的編程接口,允許開發者以編程方式直接訪問和處理 XML 數據。本文將深入探討 XML E4X 的概念、特點、應用場景以及高…

uniapp---入門、基本配置了解

目錄 uniapp 新建項目 uniapp全局配置 組件 1、內置組件 2、擴展 組件 uni-ui 3、第三方組件庫 uview-ui 秋云-ucharts (插件市場 ) scss語法(了解) vue2語法&#xff08;熟悉&#xff09; uniapp 官方文檔&#xff1a;uni-app官網 uni-app 是一個使用 Vue.js 開發所…

springboot 好處

思考1&#xff0c;快速啟動&#xff0c;簡化配置。自動配置&#xff0c;內置tomcat&#xff0c;無需部署war文件&#xff0c;快速創建獨立應用2&#xff0c;提高開發效率&#xff0c;熱部署3&#xff0c;微服務生態4&#xff0c;云原生&#xff0c;Docker K8sSpring Boot 的主要…

SSM框架學習——day1

SSM框架概述SSM框架是Java開發中常用的組合框架&#xff0c;由Spring、Spring MVC和MyBatis三個開源框架整合而成。主要用于構建企業級Web應用程序&#xff0c;具有輕量級、模塊化、易擴展等特點。Spring框架作為核心&#xff0c;提供依賴注入&#xff08;DI&#xff09;和面向…

【html基本界面】

小米界面布局效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小米商城布局<…

【設計模式】適配器模式(包裝器模式),缺省適配器模式,雙向適配器模式

適配器模式&#xff08;Adapter Pattern&#xff09;詳解 一、適配器模式簡介 適配器模式是一種結構型設計模式&#xff0c;它將一個類的接口轉換成客戶端所期望的另一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以協同工作。 簡單來說&#xff0c;適配…

安全初級(一)

一.docker的搭建和VPN連接 1.輸入指令&#xff1a;apt-get install docker.io docker-compose 2.設置docker代理&#xff1a;創建文件夾以及對應的文件 /etc/systemd/system/docker.service.d/http-proxy.conf 在該文件中配置自己的代理ip以及代理端口 [Service] Environme…

Java多線程:核心技術與實戰指南

目錄&#x1f680;前言&#x1f914;什么是多線程&#xff1f;&#x1f4bb;創建線程&#x1f4af;創建方法一&#xff1a;繼承Thread類&#x1f4af;創建方法二&#xff1a;實現Runnable接口&#x1f4af;創建方法三&#xff1a;實現Callable接口&#x1f4af;三種方法對比&am…

高斯代數基本定理的一種證明

代數基本定理 對于多項式 f(z)anznan?1zn?1?a1za0f(z) a_n z^n a_{n-1} z^{n-1} \cdots a_1 z a_0f(z)an?znan?1?zn?1?a1?za0?&#xff08;其中 n>1n > 1n>1 且 an,a0≠0a_n, a_0 \neq 0an?,a0?0&#xff09;&#xff0c;它在復數域內有根。 f(z)U…

【K8S】Kubernetes 使用 Ingress-Nginx 基于 Cookie 實現會話保持的負載均衡

文章目錄 1. 創建測試應用 Deployment3. 配置基于 Cookie 的 Ingress4. 部署與測試步驟(1) 應用配置(2) 獲取 Ingress IP(3) 測試會話保持(4) 使用 Nginx 取消域名的限制(僅推薦測試使用)5、生產優化建議6、獨立 Nginx 配置參考在現代微服務架構中,負載均衡是保證高可用的關…

2.查詢操作-demo

在連接數據庫的基礎上步驟&#xff1a;Query-查詢關閉查詢db.Next()逐行輸出&#xff0c;并指定到當前變量Scan-掃描rows, err : db.Query("SELECT id,server_ip FROM softswitch_server_info")package main//查詢語句-demo //關鍵字-queryimport ("database/sq…

用OpenCV標定相機內參應用示例(C++和Python)

下面是一個完整的 使用 OpenCV 進行相機內參標定&#xff08;Camera Calibration&#xff09; 的示例&#xff0c;包括 C 和 Python 兩個版本&#xff0c;基于棋盤格圖案標定。一、目標&#xff1a;相機標定 通過拍攝多張帶有棋盤格圖案的圖像&#xff0c;估計相機的內參&#…

(二)OpenCV——邊緣增強與檢測

邊緣增強與檢測是圖像處理中的核心技術&#xff0c;其核心目標是突出圖像中的不連續區域&#xff08;邊緣&#xff09;&#xff0c;為后續的圖像分析提供基礎。一、基本概念邊緣本質上是圖像中灰度/顏色發生突變的區域&#xff0c;對應著&#xff1a;物體邊界表面方向改變材質變…

018 進程控制 —— 進程等待

&#x1f984; 個人主頁: 小米里的大麥-CSDN博客 &#x1f38f; 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 &#x1f381; GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄進程控制 —— 進程等待1. 進程等待必要性2. 常用等待方法&#xf…

PHP password_hash() 函數

password_hash() 函數用于創建密碼的散列&#xff08;hash&#xff09;PHP 版本要求: PHP 5 > 5.5.0, PHP 7語法string password_hash ( string $password , int $algo [, array $options ] )password_hash() 使用足夠強度的單向散列算法創建密碼的散列&#xff08;hash&…

理解Linux文件系統:從物理存儲到統一接口

目錄 一、狹義理解&#xff08;物理層面&#xff09; 二、廣義理解&#xff08;Linux系統視角&#xff09; 三、文件結構解析 四、系統實現機制 一、狹義理解&#xff08;物理層面&#xff09; 存儲特性&#xff1a;文件以二進制形式存儲在磁盤等永久性存儲介質中 介質特點…

前端接入海康威視攝像頭的三種方案

方案選擇?方案適用場景優缺點?Web SDK&#xff08;3.0&#xff09;??需要完整功能&#xff08;PTZ控制、錄像回放&#xff09;功能全&#xff0c;但需加載海康JS文件?RTSP轉Web播放?低延遲實時監控需后端轉碼&#xff08;如FFmpeg轉HLS&#xff09;?HTTP API?簡單截圖或…