Python對比兩張CAD圖并標記差異的解決方案

以下是使用Python對比兩張CAD圖并標記差異的解決方案,結合圖像處理和CAD結構分析:


一、環境準備與庫選擇

  1. 圖像處理庫:使用OpenCV進行圖像差異檢測、顏色空間轉換和輪廓分析。
  2. CAD解析庫:若為DXF格式,使用ezdxf解析實體信息(如塊、線條、圓等)。
  3. 幾何計算庫scikit-image用于結構相似性(SSIM)和仿射變換匹配。
import cv2
import ezdxf
from skimage.metrics import structural_similarity

二、關鍵步驟實現

1. 加載與預處理
  • 圖像格式:使用OpenCV讀取圖片并轉換為灰度圖,進行高斯模糊去噪。
    left_img = cv2.imread("left.png")
    right_img = cv2.imread("right.png")
    gray_left = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY)
    gray_right = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)
    
  • DXF格式:通過ezdxf提取實體坐標和屬性。
    doc_left = ezdxf.readfile("left.dxf")
    doc_right = ezdxf.readfile("right.dxf")
    
2. 紅框區域檢測
  • 顏色閾值法:在HSV空間識別紅色區域,提取紅框坐標。
    hsv = cv2.cvtColor(right_img, cv2.COLOR_BGR2HSV)
    lower_red = np.array([0, 50, 50])
    upper_red = np.array([10, 255, 255])
    mask = cv2.inRange(hsv, lower_red, upper_red)
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
3. 差異檢測
  • 圖像差異法:通過像素對比標記新增部件。
    diff = cv2.absdiff(gray_left, gray_right)
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
    
  • 實體對比法(DXF):遍歷右圖實體,檢查是否存在于左圖。
    right_entities = {entity.dxf.handle for entity in doc_right.modelspace()}
    left_entities = {entity.dxf.handle for entity in doc_left.modelspace()}
    new_entities = right_entities - left_entities
    
4. 旋轉匹配檢測
  • 仿射變換匹配:對左圖零件進行旋轉,與右圖紅框區域計算相似度。
    (height, width) = right_roi.shape[:2]
    center = (width // 2, height // 2)
    rotation_matrix = cv2.getRotationMatrix2D(center, angle=90, scale=1)
    rotated_left = cv2.warpAffine(left_roi, rotation_matrix, (width, height))
    ssim_score = structural_similarity(rotated_left, right_roi)
    if ssim_score > 0.8:  # 閾值可調整cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 255, 0), 2)  # 標記為旋轉后的零件
    
5. 結果標記
  • 在右圖中用綠色框標記旋轉后的零件,用紅色框標記完全新增的零件。
    for (x, y, w, h) in new_contours:cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 0, 255), 2)
    

三、優化與注意事項

  1. 閾值調整:根據實際圖像質量調整SSIM相似度閾值(如0.7-0.9)。
  2. 多角度旋轉匹配:若旋轉角度未知,可遍歷0°-360°以尋找最大匹配值。
  3. 矢量數據優先:若為DXF文件,直接對比實體屬性更高效。

示例輸出效果

  • 紅色框:右圖新增的獨立零部件。
  • 綠色框:左圖零件經旋轉后存在于右圖的區域。

通過結合圖像差異和幾何變換匹配,可精準識別新增與變換的零件。若需完整代碼或參數調優細節,可進一步提供CAD樣本文件。

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

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

相關文章

記錄學習記錄學習《手動學習深度學習》這本書的筆記(九)

馬不停蹄地來到了第十二章:計算性能…… 感覺應該是講并行計算方面的,比如GPU、CPU、CUDA那些。 第十二章:計算性能 12.1 編譯器和解釋器 這里先提出了命令式編程和符號式編程的概念。 命令式編程VS符號式編程 目前為止,本書…

模板引擎語法-過濾器

模板引擎語法-過濾器 文章目錄 模板引擎語法-過濾器[toc]1.default過濾器2.default_if_none過濾器3.length過濾器4.addslashes過濾器5.capfirst過濾器6.cut過濾器7.date過濾器8.dictsort過濾器 1.default過濾器 default過濾器用于設置默認值。default過濾器對于變量的作用&…

make學習三:書寫規則

系列文章目錄 Make學習一:make初探 Make學習二:makefile組成要素 文章目錄 系列文章目錄前言默認目標規則語法order-only prerequisites文件名中的通配符偽目標 Phony Targets沒有 Prerequisites 和 recipe內建特殊目標名一個目標多條規則或多個目標共…

網絡安全技能大賽B模塊賽題解析Server12環境

已知靶機存在?站系統,使?Nmap?具掃描靶機端?,并將?站服務的端?號作為Flag (形式:Flag字符串)值提交 使用nmap掃描目標靶機網站服務的端口號為8089 Falg:8089 訪問?站/admin/pinglun.asp??&#…

1、Linux操作系統下,ubuntu22.04版本切換中英文界面

切換中英文界面的方法很多,我也是按照一個能用的方法弄過來并且記錄, 1.如果剛開始使用Ubuntu環境,桌面的語言環境為英文,需要安裝中文簡體的字體包 打開桌面終端,輸入 sudo apt install language-pack-zh-hans lan…

SmolVLM2: The Smollest Video Model Ever(六)

繼續微調 微調視頻的代碼如下: # 此Python文件用于對SmolVLM2進行視頻字幕任務的微調 # 導入所需的庫 import os os.environ["CUDA_VISIBLE_DEVICES"] "1" import torch from peft import LoraConfig, prepare_model_for_kbit_training, get…

Spring Boot安裝指南

🔖 Spring Boot安裝指南 🌱 Spring Boot支持兩種使用方式: 1?? 可作為常規Java開發工具使用 2?? 可作為命令行工具安裝 ?? 安裝前提: 📌 系統需安裝 Java SDK 17 或更高版本 🔍 建議先運行檢查命令…

數據結構(七)---鏈式棧

#### 鏈式棧實現 ##### linkstack.h #ifndef _LINKSTACK_H #define _LINKSTACK_H // 引入相關的庫文件 #include <stdio.h> #include <stdlib.h> #include <string.h> // 定義元素類型的別名 typedef int DATA; //定義鏈式棧節點 typedef struct node { …

【Spring Boot】Maven中引入 springboot 相關依賴的方式

文章目錄 Maven中引入 springboot 相關依賴的方式1. 不使用版本管理&#xff08;不推薦&#xff09;2、使用版本管理&#xff08;推薦&#xff09;2.1 繼承 spring-boot-starter-parent2.2 使用 spring-boot-dependencies 自定義父工程2.3引入 spring-framework-bom Maven中引…

DataStreamAPI實踐原理——快速上手

引入 通過編程模型&#xff0c;我們知道Flink的編程模型提供了多層級的抽象&#xff0c;越上層的API&#xff0c;其描述性和可閱讀性越強&#xff0c;越下層API&#xff0c;其靈活度高、表達力越強&#xff0c;多數時候上層API能做到的事情&#xff0c;下層API也能做到&#x…

WPF 圖片文本按鈕 自定義按鈕

效果 上面圖片,下面文本 樣式 <!-- 圖片文本按鈕樣式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

驅動開發硬核特訓 · Day 22(上篇): 電源管理體系完整梳理:I2C、Regulator、PMIC與Power-Domain框架

&#x1f4d8; 一、電源子系統總覽 在現代Linux內核中&#xff0c;電源管理不僅是系統穩定性的保障&#xff0c;也是實現高效能與低功耗運行的核心機制。 系統中涉及電源管理的關鍵子系統包括&#xff1a; I2C子系統&#xff1a;硬件通信基礎Regulator子系統&#xff1a;電源…

設計模式全解析:23種經典設計模式及其應用

創建型模式 1. 單例模式&#xff08;Singleton Pattern&#xff09; 核心思想&#xff1a;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。適用場景&#xff1a;需要共享資源的場景&#xff0c;如配置管理、日志記錄等。 public class Singleton {// 靜態變量保存…

力扣熱題100題解(c++)—矩陣

73.矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 int m matrix.size(); // 行數int n matrix[0].size(); // 列數bool firstRowZero false; // 標記第一行是否包含 0bool f…

本地部署DeepSeek-R1(Dify升級最新版本、新增插件功能、過濾推理思考過程)

下載最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升級DIfy 下載最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我這里下載到老版本同一個目錄并解壓 拷貝老數據 需先停用老版本Dify PS D:\D…

PostSwigger Web 安全學習:CSRF漏洞3

CSRF 漏洞學習網站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服務端生成的唯一、隨機且不可預測的字符串&#xff0c;用于驗證客戶端合法校驗。 作用&#xff1a;防止攻擊…

用 Nodemon 解決 npm run serve 頻繁重啟服務

Nodemon 是一個基于 Node.js 構建的開發工具&#xff0c;專為幫助開發者自動監控項目文件的更改而設計。每當文件發生變更時&#xff0c;Nodemon 會自動重啟 Node.js 服務器&#xff0c;無需手動停止并重啟。這對于提升開發速度、減少人工操作非常有幫助&#xff0c;尤其適用于…

django admin 中更新表數據 之后再將數據返回管理界面

在Django中&#xff0c;更新數據庫中的數據并將其重新顯示在Django Admin界面上通常涉及到幾個步驟。這里我將詳細說明如何在Django Admin中更新表數據&#xff0c;并確保更新后的數據能夠立即在管理界面上顯示。 定義模型 首先&#xff0c;確保你的模型&#xff08;Model&…

真.從“零”搞 VSCode+STM32CubeMx+C <1>構建

目錄 前言 準備工作 創建STM32CubeMx項目 VSCode導入項目&配置 構建錯誤調試 后記 前言 去年10月開始接觸單片機&#xff0c;一直在用樹莓派的Pico&#xff0c;之前一直用Micropython&#xff0c;玩的不亦樂乎&#xff0c;試錯階段優勢明顯&#xff0c;很快就能鼓搗一…

C語言學習之結構體

在C語言中&#xff0c;我們已經學了好幾種類型的數據。比如整型int、char、short等&#xff0c;浮點型double、float等。但是這些都是基本數據類型&#xff0c;而這些數據類型應用在實際編程里顯然是不夠用的。比如我們沒有辦法用一旦數據類型來定義一個”人“的屬性。因此這里…