1. 程式人生 > >C/C++ 影象處理(15)------DXF檔案の讀取、繪圖與顯示

C/C++ 影象處理(15)------DXF檔案の讀取、繪圖與顯示

關於DXF檔案的讀取自幾年前做專案的時候就用到了,不過當時是另外一個朋友負責的就沒在意,直至最近的專案又要用到方才自己動手去弄。
因為幾年前專案的程式碼還在,因此看了下發現之前朋友是用dxflib開源庫實現的,因此也用了同樣的庫。
上網一查發現資料相當少,因為事很多比較忙,不大想去慢慢看說明文件,遇到一些疑問便在網上一個實現了功能的部落格中問,哪知博主直接回復如下:
這裡寫圖片描述
實在讓人無語,只得讓實驗室的同學去研究下格式文件告知我思路。同學直接看了下說明文件也就實現了,還沒用到開源庫,實在沒有什麼難的。
因此乘著終於閒了下來寫出本篇部落格,一則讓有需要的人可以參考參考,二則鄙視下自以為是的這個博主,看了其寫的東西實在是沒有什麼了不起的,不知哪來的底氣!
OK,說了些離題的東西,下面進入主題。因為用到了dxflib開源庫,自然需要去下載該庫,地址如下(亦可從本文最後給出的工程中獲得):

http://www.qcad.org/en/dxflib-downloads
解壓出dxflib庫的壓縮包,裡面有幾個東西,其中src資料夾中的東西是最重要的,而examples則給出了兩個使用的例子。因為專案只需要讀取DXF檔案而不需要去寫,則並沒有去研究寫的那一部分,後面涉及到則會加上。
DXF的檔案架構大體如下圖所示:
這裡寫圖片描述
上圖是本人經過閱讀文件和查閱其他資料後畫出來的,不算詳盡,但就讀DXF檔案而言差不多了。
由該圖可見,DXF的線,圓等實體要麼在block中,要麼在entities中,這兩者的區別在於block只有在後面被insert之後才真正的加入到影象中,否則只是一個單獨的東西,可以不加理會。而entities則需要繪製出來。
另外一個是block塊相對於世界座標系有一個縮放和平移關係,也就是說block內部的線,圓等物件的座標需要進行換算才能與世界座標系相對應。
另外有幾點需要注意的:
1.在VS2015平臺下,類似於sprintf、fopen等這樣的函式會被認為是不安全的,解決方法有多種,最好是將這些函式改成sprintf_s、fopen_s等VS2015編譯器所認同的形式。
2.多線段實體閉合與否需要檢測,如果檢測為閉合則最後需要繪製出終點到起點的線。
3.畫圓弧的時候需要通過其起點角度和終點角度的比較判斷其是順時針還是逆時針。
4.由於本人希望將檔案轉換成影象,因此需要知道實體的邊界,故做了邊界探測。如果是希望做出AutoCAD的那種效果,則得到所有物件座標後,實時對映到指定區域即可。
5.本人有一些實體還沒實現,例如文字實體這些,後面有時間會補上,君亦可自行補充,比較簡單。
至於具體的細節太繁瑣就不說了,直接上工程連結:
https://git.oschina.net/weixinhum/ReadDXF/tree/master/

若有需要請任意下載,亦可用VS直接克隆過去,本人已經內建了OpenCV,直接編譯即可。如有問題請告知與我。
最後上一張解析出來的影象:
這裡寫圖片描述

相關推薦

C/C++ 影象處理15------DXF檔案讀取繪圖顯示

關於DXF檔案的讀取自幾年前做專案的時候就用到了,不過當時是另外一個朋友負責的就沒在意,直至最近的專案又要用到方才自己動手去弄。 因為幾年前專案的程式碼還在,因此看了下發現之前朋友是用dxflib開源庫實現的,因此也用了同樣的庫。 上網一查發現資料相當少,因

python數字影象處理15:霍夫線變換

在圖片處理中,霍夫變換主要是用來檢測圖片中的幾何形狀,包括直線、圓、橢圓等。 在skimage中,霍夫變換是放在tranform模組內,本篇主要講解霍夫線變換。 對於平面中的一條直線,在笛卡爾座標系中,可用y=mx+b來表示,其中m為斜率,b為截距。但是如果直線是一條垂直線,則m為無窮大,所有通常我們

Python3+OpenCV3影象處理——列印圖片屬性設定圖片儲存路徑電腦攝像頭的調取和顯示

一. 列印圖片屬性、設定圖片儲存路徑 程式碼如下: #列印圖片的屬性、儲存圖片位置 import cv2 as cv import numpy as np #numpy是一個開源的Python科學計算庫 def get_image_info(image):

【OpenCV入門教程之十一】 形態學影象處理:開運算閉運算形態學梯度頂帽黑帽合輯

上篇文章中,我們重點了解了腐蝕和膨脹這兩種最基本的形態學操作,而運用這兩個基本操作,我們可以實現更高階的形態學變換。所以,本文的主角是OpenCV中的morphologyEx函式,它利用基本的膨脹和腐蝕技術,來執行更加高階的形態學變換,如開閉運算、形態學梯度、“頂帽”、“黑帽

c語言數字影象處理:二維離散傅立葉變換

基礎知識 複數表示 C = R + jI 極座標:C = |C|(cosθ + jsinθ) 尤拉公式:C = |C|ejθ 有關更多的時域與複頻域的知識可以學習複變函式與積分變換,本篇文章只給出DFT公式,性質,以及實現方法 二維離散傅立葉變換(DFT) 其中f(x,y)為原影象,F(u,

c語言數字影象處理:邊緣檢測

背景知識 邊緣畫素是影象中灰度突變的畫素,而邊緣是連線邊緣畫素的集合。邊緣檢測是設計用來檢測邊緣畫素的區域性影象處理方法。 孤立點檢測 使用<https://www.cnblogs.com/GoldBeetle/p/9744625.html>中介紹的拉普拉斯運算元 輸出影象為 卷積模

c語言數字影象處理:閾值處理

定義 全域性閾值處理 假設某一副灰度圖有如下的直方圖,該影象由暗色背景下的較亮物體組成,從背景中提取這一物體時,將閾值T作為分割點,分割後的影象g(x, y)由下述公式給出,稱為全域性閾值處理   多閾值處理 本文僅完成全域性閾值處理的演算法實現 基本全域性閾值處理方法

c語言數字影象處理:圖片放大縮小-雙線性內插法

int is_in_array(short x, short y, short height, short width) { if (x >= 0 && x < width && y >= 0 && y < height)

c語言數字影象處理:仿射變換

1 void bilinera_interpolation(short** in_array, short height, short width, 2 short** out_array, short out_height, short out

c語言數字影象處理:灰度變換

灰度變換 灰度變換函式 s = T(r)   其中r為輸入影象在(x, y)點處的灰度值,s為輸出影象在(x, y)點處的灰度值 灰度變換的作用   上圖所示的兩幅T(s)函式的影象曲線,第一幅圖可以增強影象對比度,第二幅圖可以對影象進行二值化處理 灰度變換函式 反轉函式 1 void reverse(s

c語言數字影象處理:空間濾波

 空間濾波原理 使用大小為m*n的濾波器對大小為M*N的影象進行線性空間濾波,將濾波器模板乘以影象中對應灰度值,相加得模板中心灰度值                                                                              a = (m-1)

c語言數字影象處理:噪聲模型及均值濾波器

影象退化/復原過程模型 高斯噪聲 PDF(概率密度函式) 生成高斯隨機數序列 演算法可參考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf> 程式碼實現 1 double gaussrand() 2 { 3 static

C++ Opencv——影象處理處理+矩形物體分割

 影象預處理分割目標 // ROI提取 Mat Image_ROI(Mat frame) { Mat gray, bw, img, bkup; /*目標提取——預處理——Mat ROI*/ /*預處理很重要——直接找到目標*/ //預處理很重要——直接找到目標 // 灰度化

C++ Opencv——影象處理色道分離融合

Mat HSV; cv::cvtColor(src, HSV, CV_BGR2HSV); imshow("get HSV", HSV); vector<Mat> H_S_V; split(HSV, H_S_V); imshow("H", H_S_V[0]); imshow("S", H_

C/C++ 影象處理13------雙目影象の深度圖生成

雙目影象可用於生成具有深度的三維影象,其是通過模仿動物雙眼的工作機制而來。關於其相關的演算法,現如今研究的人很多,但仍離動物雙眼的視覺效果千里之遙,只能用在非常有限的範圍之內。 近來由於專案所需,要用到雙目影象生成深度圖,因此做了些研究,然並未深入理解其原理,

OpenCv VS C++ 影象處理

繼續OpenCv的影象處理對於上一節的inRange得到兩幅影象等情況,可以使用addWeighted處理。(1).然後講形態學濾波#include<opencv2\core\core.hpp> #include<opencv2\highgui\highgu

C/C++ BMP24位真彩色影象處理2------影象の擷取

對上一篇部落格《C/C++ BMP(24位真彩色)影象處理(1)------影象開啟與資料區處理》的程式碼做小部分的修改,就可以進行BMP影象的擷取操作,程式碼如下: #include <string.h> #include <math.h>

OpenCv VS C++ 影象處理

 VS OpenCv配置:  首先是VS的OpenCv配置,外部庫目錄指定和外部包含檔案的指定。 指定建立的工程為空白工程: 建立完工程之後,我們選中解決方案欄中的Resource Files目錄(即原始碼目錄),然後新建一個C++原始碼檔案: 設

C/C++ 影象處理14------影象の輪廓填充

所謂影象的輪廓填充,是建立在影象的輪廓已然查詢完成的情況下的,以下面影象為例: 我們首先需要查詢到影象中的圓形和正方形的幾個輪廓,之後才能對這些輪廓進行處理(查詢的過程我們用到OpenCV的findContours函式)。 在得到輪廓之後,難點就轉變為如

C/C++ 影象處理18------人臉檢測

人臉識別包括人臉檢測和識別兩個部分 一般的邏輯是先檢測人臉位置,然後再識別。 具體的流程是 準備要識別的人臉資料->檢測人臉->學習人臉特徵並生成模型 檢測人臉->對比檢測出來的人臉和模型的相識度->給出識別結果