A. 零基礎學python應該學習哪些入門知識
關於零基礎怎麼樣能快速學好Python的問題,網路提問和解答的都很多,你可以網路下看看。我覺得從個人自學的角度出發,應從以下幾個方面來理解:
1 為什麼選擇學python?
據統計零基礎或非專業的人士學python的比較多,據HackerRank開發者調查報告2018年5月顯示(見圖),Python排名第一,成為最受歡迎編程語言。Python以優雅、簡潔著稱,入行門檻低,可以從事linux運維、Python Web網站工程師、Python自動化測試、數據分析、人工智慧等職位,薪資待遇呈上漲趨勢。
2 入門python需要那些准備?
2.1 心態准備。編程是一門技術,也可說是一門手藝。如同書法、繪畫、樂器、雕刻等,技藝純熟的背後肯定付出了長時間的反復練習。不要相信幾周速成,也不能急於求成。編程的世界浩瀚無邊,所以請保持一顆敬畏的心態去學習,認真對待寫下的每一行代碼,甚至每一個字元。收拾好自己的心態,向著編程的世界出發。第一步至關重要,關繫到初學者從入門到精通還是從入門到放棄。選一條合適的入門道路,並堅持走下去。
2.2 配置 Python 學習環境。選Python2 還是 Python3?入門時很多人都會糾結。二者只是程序不兼容,思想上並無大差別,語法變動也並不多。選擇任何一個入手,都沒有大影響。如果你仍然無法抉擇,那請選擇 Python3,畢竟這是未來的趨勢。
編輯器該如何選?同樣,推薦 pycharm 社區版,配置簡單、功能強大、使用起來省時省心,對初學者友好,並且完全免費!其他編輯器如:notepad++、sublimeText 3、vim 和 Emacs等不推薦了。
操作環境?Python 支持現有所有主流操作平台,不管是 windows 還是 mac 還是 linux,都能很好的運行 Python。並且後兩者都默認自帶 Python 環境。
2.3 選擇自學的書籍。我推薦的書的內容由淺入深,建議按照先後順序閱讀學習:
2.3.1《Python簡明教程》。這是一本言簡意賅的 Python 入門教程,簡單直白,沒有廢話。就算沒有基礎,你也可以像讀小說一樣,花兩天時間就可以讀完。適合入門快速了解語法。
2.3.2 廖雪峰編寫的《Python教程》。廖先生的教程涵蓋了 Python 知識的方方面面,內容更加系統,有一定深度,有一定基礎之後學習會有更多的收獲。
2.4 學會安裝包。Python中有很多擴展包,想要安裝這些包可以採用兩種方法:
2.4.1 使用pip或easy_install。
1)在網上找到的需要的包,下載下來。eg. rsa-3.1.4.tar.gz;
2)解壓縮該文件;
3)命令行工具cd切換到所要安裝的包的目錄,找到setup.py文件,然後輸入python setup.py install
2.4.2 不用pip或easy_install,直接打開cmd,敲pip install rsa。
3 提升階段需要恆心和耐力。
完成入門階段的基礎學習之後,常會陷入一個瓶頸期,通過看教程很難進一步提高編程水平。這時候,需要的是反復練習,大量的練習。可以從書上的例題、作業題開始寫,再寫小程序片段,然後寫完整的項目。我們收集了一些練習題和網站。可根據自己階段,選擇適合的練習去做。建議最好挑選一兩個系列重點完成,而不是淺嘗輒止。
3.1 多做練習。推薦網站練習:
crossin編程教室實例:相對於編程教室基礎練習著重於單一知識點,
編程實例訓練對基礎知識的融會貫通;
hackerrank:Python 部分難度循序漸進,符合學習曲線
實驗樓:提升編程水平從做項目開始;
codewar:社區型編程練習網站,內容由易到難;
leetcode:為編程面試准備,對初學者稍難;
牛客網:提供 BAT 等大廠筆試題目;
codecombat:提供一邊游戲一邊編程;
projecteuler:純粹的編程練習網站;
菜鳥教程100例:基於 py2 的基礎練習;
3.2 遇到問題多交流。
3.2.1 利用好搜索引擎。
3.2.2 求助於各大網站。推薦
stackoverflow:這是一個程序員的知識庫;
v2ex:國內非常不錯的編程社區,不僅僅是包含程序,也包含了程序員的生活;
segmentfault:一家以編程問答為主的網站;
CSDN、知乎、簡書等
3.2.3 加入相關的QQ、微信群、網路知道。不懂的可以隨時請教。
B. python程序如何工作
隨著人工智慧時代的來臨,python成為了人們學習編程的首先語言。那麼,python程序怎麼運行的?我們下面來介紹下。
python程序執行原理
我們都知道,使用C,C++之類的編譯性語言編寫的程序,是需要從源文件轉換成計算機使用的機器語言,經過鏈接器鏈接之後形成了二進制可執行文件。運行該程序的時候,就可以二進製程序從硬碟載入到內存中並運行。
相關推薦:《Python教程》
但是對於Python而言,Python源碼不需要編譯成二進制代碼,它可以直接從源代碼運行程序。Python解釋器將源代碼轉換為位元組碼,然後把編譯好的位元組碼轉發到Python虛擬機(PVM)中進行執行。當我們運行Python程序的時候,Python解釋器會執行兩個步驟。
(1) 把源代碼編譯成位元組碼。編譯後的位元組碼是特定於Python的一種表現形式,它不是二進制的機器碼,需要進一步編譯才能被機器執行,這也是Python代碼無法運行的像C,C++一樣快的原因。如果Python進程在機器上擁有寫入許可權,那麼它將把程序的位元組碼保存為一個以.pyc為擴展名的文件,如果Python無法在機器上寫入位元組碼,那麼宇節碼將會在內存中生成並在程序結束時自動丟棄。在構建程序的時候最好給Python賦上在計算機上寫的許可權,這樣只要源代碼沒有改變,生成的.pyc文件可以重復利用,提高執行效率。
(2) 把編譯好的位元組碼轉發到Python虛擬機(PVM)中進行執行。PVM是Python Virtual Machine的簡稱,它是Python的運行引擎,是Python系統的一部分,它是迭代運行位元組碼指令的一個大循環,一個接一個地完成操作。
C. Python 實現埠掃描
一、常見埠掃描的原理
0、秘密掃描
秘密掃描是一種不被審計工具所檢測的掃描技術。
它通常用於在通過普通的防火牆或路由器的篩選(filtering)時隱藏自己。
秘密掃描能躲避IDS、防火牆、包過濾器和日誌審計,從而獲取目標埠的開放或關閉的信息。由於沒有包含TCP 3次握手協議的任何部分,所以無法被記錄下來,比半連接掃描更為隱蔽。
但是這種掃描的缺點是掃描結果的不可靠性會增加,而且掃描主機也需要自己構造IP包。現有的秘密掃描有TCP FIN掃描、TCP ACK掃描、NULL掃描、XMAS掃描和SYN/ACK掃描等。
1、Connect()掃描
此掃描試圖與每一個TCP埠進行「三次握手」通信。如果能夠成功建立接連,則證明埠開發,否則為關閉。准確度很高,但是最容易被防火牆和IDS檢測到,並且在目標主機的日誌中會記錄大量的連接請求以及錯誤信息。
TCP connect埠掃描服務端與客戶端建立連接成功(目標埠開放)的過程:
① Client端發送SYN;
② Server端返回SYN/ACK,表明埠開放;
③ Client端返回ACK,表明連接已建立;
④ Client端主動斷開連接。
建立連接成功(目標埠開放)
TCP connect埠掃描服務端與客戶端未建立連接成功(目標埠關閉)過程:
① Client端發送SYN;
② Server端返回RST/ACK,表明埠未開放。
優點:實現簡單,對操作者的許可權沒有嚴格要求(有些類型的埠掃描需要操作者具有root許可權),系統中的任何用戶都有權力使用這個調用,而且如果想要得到從目標埠返回banners信息,也只能採用這一方法。
另一優點是掃描速度快。如果對每個目標埠以線性的方式,使用單獨的connect()調用,可以通過同時打開多個套接字,從而加速掃描。
缺點:是會在目標主機的日誌記錄中留下痕跡,易被發現,並且數據包會被過濾掉。目標主機的logs文件會顯示一連串的連接和連接出錯的服務信息,並且能很快地使它關閉。
2、SYN掃描
掃描器向目標主機的一個埠發送請求連接的SYN包,掃描器在收到SYN/ACK後,不是發送的ACK應答而是發送RST包請求斷開連接。這樣,三次握手就沒有完成,無法建立正常的TCP連接,因此,這次掃描就不會被記錄到系統日誌中。這種掃描技術一般不會在目標主機上留下掃描痕跡。但是,這種掃描需要有root許可權。
·埠開放:(1)Client發送SYN;(2)Server端發送SYN/ACK;(3)Client發送RST斷開(只需要前兩步就可以判斷埠開放)
·埠關閉:(1)Client發送SYN;(2)Server端回復RST(表示埠關閉)
優點:SYN掃描要比TCP Connect()掃描隱蔽一些,SYN僅僅需要發送初始的SYN數據包給目標主機,如果埠開放,則相應SYN-ACK數據包;如果關閉,則響應RST數據包;
3、NULL掃描
反向掃描—-原理是將一個沒有設置任何標志位的數據包發送給TCP埠,在正常的通信中至少要設置一個標志位,根據FRC 793的要求,在埠關閉的情況下,若收到一個沒有設置標志位的數據欄位,那麼主機應該舍棄這個分段,並發送一個RST數據包,否則不會響應發起掃描的客戶端計算機。也就是說,如果TCP埠處於關閉則響應一個RST數據包,若處於開放則無相應。但是應該知道理由NULL掃描要求所有的主機都符合RFC 793規定,但是windows系統主機不遵從RFC 793標准,且只要收到沒有設置任何標志位的數據包時,不管埠是處於開放還是關閉都響應一個RST數據包。但是基於Unix(*nix,如Linux)遵從RFC 793標准,所以可以用NULL掃描。 經過上面的分析,我們知道NULL可以辨別某台主機運行的操作系統是什麼操作系統。
埠開放:Client發送Null,server沒有響應
埠關閉:(1)Client發送NUll;(2)Server回復RST
說明:Null掃描和前面的TCP Connect()和SYN的判斷條件正好相反。在前兩種掃描中,有響應數據包的表示埠開放,但在NUll掃描中,收到響應數據包表示埠關閉。反向掃描比前兩種隱蔽性高些,當精確度也相對低一些。
用途:判斷是否為Windows系統還是Linux。
4、FIN掃描
與NULL有點類似,只是FIN為指示TCP會話結束,在FIN掃描中一個設置了FIN位的數據包被發送後,若響應RST數據包,則表示埠關閉,沒有響應則表示開放。此類掃描同樣不能准確判斷windows系統上埠開發情況。
·埠開放:發送FIN,沒有響應
·埠關閉:(1)發送FIN;(2)回復RST
5、ACK掃描
掃描主機向目標主機發送ACK數據包。根據返回的RST數據包有兩種方法可以得到埠的信息。方法一是: 若返回的RST數據包的TTL值小於或等於64,則埠開放,反之埠關閉。
6、Xmas-Tree掃描
通過發送帶有下列標志位的tcp數據包。
·URG:指示數據時緊急數據,應立即處理。
·PSH:強制將數據壓入緩沖區。
·FIN:在結束TCP會話時使用。
正常情況下,三個標志位不能被同時設置,但在此種掃描中可以用來判斷哪些埠關閉還是開放,與上面的反向掃描情況相同,依然不能判斷windows平台上的埠。
·埠開放:發送URG/PSH/FIN,沒有響應
·埠關閉:(1)發送URG/PSH/FIN,沒有響應;(2)響應RST
XMAS掃描原理和NULL掃描的類似,將TCP數據包中的ACK、FIN、RST、SYN、URG、PSH標志位置1後發送給目標主機。在目標埠開放的情況下,目標主機將不返回任何信息。
7、Dump掃描
也被稱為Idle掃描或反向掃描,在掃描主機時應用了第三方僵屍計算機掃描。由僵屍主機向目標主機發送SYN包。目標主機埠開發時回應SYN|ACK,關閉時返回RST,僵屍主機對SYN|ACK回應RST,對RST不做回應。從僵屍主機上進行掃描時,進行的是一個從本地計算機到僵屍主機的、連續的ping操作。查看僵屍主機返回的Echo響應的ID欄位,能確定目標主機上哪些埠是開放的還是關閉的。
二、Python 代碼實現
1、利用Python的Socket包中的connect方法,直接對目標IP和埠進行連接並且嘗試返回結果,而無需自己構建SYN包。
2、對IP埠進行多線程掃描,注意的是不同的電腦不同的CPU每次最多創建的線程是不一樣的,如果創建過多可能會報錯,需要根據自己電腦情況修改每次掃描的個數或者將seelp的時間加長都可以。
看完了嗎?感覺動手操作一下把!
python學習網,免費的在線學習python平台,歡迎關注!
本文轉自:https://www.jianshu.com/p/243bb7cfc40f
D. 目標跟蹤(5)使用 Opencv 和 Python 進行對象跟蹤
在本教程中,我們將學習如何基於 Opencv 和 Python 實現對象跟蹤。
首先必須明確目標檢測和目標跟蹤有什麼區別:
我們將首先討論對象檢測,然後討論如何將對象跟蹤應用於檢測。
可能有不同的應用,例如,計算某個區域有多少人,檢查傳送帶上有多少物體通過,或者計算高速公路上的車輛。
當然,看過本教程後,您會很容易地想到數以千計的想孫腔沒法應用於現實生活或可能應用於工業。
在本教程中,我們將使用 3 個文件:
首先我們需要調用highway.mp4文件並創建一個mask:
正如您在示例代碼中看到的,我們還使用了 函數,該函數返回背景比率(background ratio),然後創建mask。
mask可視化結果:
但是,如您所見,圖像中有很多噪點。因此,讓我們通過刪除所有較小的元素來改進提取,並將我們的注意力集中在大於某個面積的對象上。
使用 OpenCV 的cv2.drawContours函數繪制輪廓,我們得到了這個結果。
就本教程而言,分析整個窗口並不重要。我們只對計算在某個點通過的所有車輛感興趣,因此,我們必須定義一個感興趣的區域 ROI 並僅在該區域應用mask。
結果可視化如下:
函數 cv2. 是在開始時添加的,沒有定義參數,現在讓我們看看如何進一步改進我們的結果。history是第一個參數,在這種情況下,它設置為 100,因為相機是固定的。varThreshold改為 40,因為該值越低,誤報的可能性就越大。在這種情況下,我們只對較大的對象感興趣。
在繼續處理矩形之前,我們對圖像進行了進一步的清理。為此,閾值函數就派上用場了。從我們的mask開始,我們告訴它我們只想顯示白色或黑色值,因此通過編寫254, 255,只會考慮 254 和 255 之間的值。
然後我們將找到的對象的坐標插入到 if 條件中並繪制矩形
這是最終結果:
我們現在只需導入和集成跟蹤功能。
一旦創建了對象,我們必須獲取邊界框的每個位置並將它們插入到單個數組中。
通過在屏幕上顯示結果,您可以看到所有通過 ROI 的通道是如何被識別的,則納以及它們的位置是如何插入到特定的數組中的。顯然,識別的摩托車越多,我們的數組就越大。
現在讓我們將帶圓行有位置的數組傳遞給tracker.update()。我們將再次獲得一個包含位置的數組,但此外,將為每個對象分配一個唯一的 ID。
從代碼中可以看出,我們可以使用 for 循環分析所有內容。此時我們只需要繪制矩形並顯示車輛 ID。
在圖像中,您可以看到結果
main.py
從視頻中也可以看到,我們已經獲得了我們在本教程開始時設置的結果。
但是,您必須將其視為練習或起點,因為關於這個主題有很多話要說,而本教程的目的只是讓您了解對象跟蹤的原理。
如果你想將 Object Tracking 集成到你的項目中,你應該使用更可靠和先進的對象檢測方法,以及跟蹤方法。
完整代碼地址:私信「333」直接獲取或者「鏈接」
E. Python OpenCV 霍夫(Hough Transform)直線變換檢測原理,圖像處理第 33 篇博客
霍夫變換(Hough Transform)是圖像處理領域中,從圖像中識別幾何形狀的基本方法之一。主要識別具有某些相同特徵的幾何形狀,例如直線,圓形,本篇博客的目標就是從黑白圖像中識別出直線。
翻閱霍夫直線變換的原理時候,橡皮擦覺得原理部分需要先略過,否則很容易在這個地方陷進去,但是問題來了,這個原理略過了,直接應用函數,裡面有些參數竟然看不懂。例如極坐標,角度掃描范圍,這種函數就屬於繞不過去的知識點了,所以本文轉移方向,死磕原理,下面的博文將語無倫次的為你展示如何學習原理知識。
因為數學知識的貧乏,所以在學習階段會涉及到很多基礎概念的學習,一起來吧。
首先找到相對官方的資料,打開該 地址
下面是一個數學小白對原理的學習經驗。
教材說:眾所周知,一條直線在圖像二維空間可由兩個變數表示。
抱歉,小白還真不知道……即使學習過,這些年也早已經還給老師了。
一開始難道要學習笛卡爾坐標系,不,你低估小白的能力了,我第一個查詢的是 θ 讀作 西塔 ,是一個希臘字母。
什麼是笛卡爾坐標系?
這個比較簡單,直角坐標系。
斜率和截距
斜率,亦稱「角系數」,表示一條直線相對於橫坐標軸的傾斜程度。
一條直線與某平面直角坐標系橫坐標軸正半軸方向的夾角的正切值即該直線相對於該坐標系的斜率。
如果直線與 x 軸互相垂直,直角的正切直無窮大,故此直線不存在斜率。
對於一次函數 y=kx+b , k 就是該函數圖像的斜率。
在學習的時候,也學到如下內容:
截距:對 x 的截距就是 y=0 時, x 的值,對 y 的截距就是 x=0 時, y 的值,
截距就是直線與坐標軸的交點的橫(縱)坐標。 x 截距為 a , y 截距 b ,截距式就是: x/a+y/b=1(a≠0且b≠0) 。
斜率:對於任意函數上任意一點,其斜率等於其切線與 x 軸正方向所成的角,即 k=tanα 。 ax+by+c=0中,k=-a/b 。
什麼是極坐標系?
關於極坐標系,打開 網路 學習一下即可。
重點學到下面這個結論就行:
找資料的時候,發現一個解釋的比較清楚的 博客 ,後續可以繼續學習使用。
繼續閱讀資料,看到如下所示的圖,這個圖也出現在了很多解釋原理的博客裡面,但是圖下面寫了一句話
在這里直接蒙掉了,怎麼就表示成極坐標系了?上面這個公式依舊是笛卡爾坐標系表示直線的方式呀,只是把 k 和 b 的值給替換掉了。
為何是這樣的,具體原因可以參照下圖。
<center>chou 圖</center>
繼續尋找關於霍夫變換的資料,找到一個新的概念 霍夫空間 。
在笛卡爾坐標系中,一條直線可以用公式 表示,其中 k 和 b 是參數,表示的是斜率和截距。
接下來將方程改寫為 ,這時就建立了一個基於 k - b 的笛卡爾坐標系。
此時這個新的方程在 k - b 坐標系也有一個新的直線。
你可以在紙上畫出這兩個方程對應的線和點,如下圖所示即可。
<center>chou 圖</center>
新的 k - b 坐標系就叫做霍夫空間,這時得到一個結論,圖像空間 x - y 中的點 對應了 霍夫空間 k - b 中的一條直線 ,即圖像空間的點與霍夫空間的直線發生了對應關系。
如果在圖像空間 x - y 中在增加一個點 ,那相應的該點在霍夫空間也會產生相同的點與線的對應關系,並且 A 點與 B 點產生的直線會在霍夫空間相交於一個點。而這個點的坐標值 就是直線 AB 的參數。
如果到這里你掌握了,這個性質就為我們解決直線檢測提供了方法,只需要把圖像空間的直線對應到霍夫空間的點,然後統計交點就可以達到目的,例如圖像空間中有 3 條直線,那對應到霍夫空間就會有 3 個峰值點。
遍歷圖像空間中的所有點,將點轉換到霍夫空間,形成大量直線,然後統計出直線交會的點,每個點的坐標都是圖像空間直線方程參數,這時就能得到圖像空間的直線了。
上述的內容沒有問題,但是存在一種情況是,當直線趨近於垂直時,斜率 k 會趨近於無窮大,這時就沒有辦法轉換了,解決辦法是使用法線來表示直線。
上文提及的斜截式如下:
通過第二個公式,可以得到下述公式:
此時,我們可以帶入一些數值進行轉換。
圖像空間有如下的幾個點:
轉換後的函數,都可以在霍夫空間 θ - ρ (橫坐標是 θ ,縱坐標是 ρ )進行表示。
原理這時就比較清晰了:
除了一些數學知識以外,經典的博客我們也有必要記錄一下,方便後面學習的時候,進行復盤。
本部分用於記錄本文中提及的相關數學原理,後續還要逐步埋坑。
今天涉及了一點點數學知識,能力限制,大家一起學習,有錯誤的地方,可以在評論區指出,不勝感激。
希望今天的 1 個小時(今天內容有點多,不一定可以看完),你有所收獲,我們下篇博客見~
相關閱讀
技術專欄
逗趣程序員