最近在作一個釣魚網站的項目中用到了一個叫opencv的玩意兒,之前沒接觸過。感受挺新鮮的,並且項目中要用,因此就問了一下度娘(是想Google一下的,顯得高大上and專業一點,可是英語水平實在是low),百度百科的解釋是這樣的(有點專業,讀完之後似懂非懂的感受,不過以爲這個東西很強勢,能夠搞一下):OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,能夠運行在Linux、Windows、Android和Mac OS操做系統上。它輕量級並且高效——由一系列 C 函數和少許 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的不少通用算法。html
下面咱們就一點一點來學習這個灰常牛逼的東西吧:python
源碼下載地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.exe/downloadlinux
安裝程序:http://jingyan.baidu.com/article/4dc408484c0ec0c8d946f180.htmlgit
源碼下載地址:https://github.com/Itseez/opencv/archive/2.4.13.zipgithub
程序安裝:http://blog.csdn.net/csqingchen/article/details/43968925算法
一開始在centos上面裝(咱們的測試服務器),死活裝不上,不知爲什麼(若是有裝上的小夥伴能夠分享一下,真是不勝感激),但代碼最後是運行在ubuntu上面的,因此就勉爲其難的在本身本地裝了一個ubuntu的虛擬機來測試代碼,之前對什麼裝軟件,配環境這方面重視的不是很夠,對於這樣的任務一開始我是拒絕的,心中非常恐懼。確實,不會開發的運維終將被淘汰,不會運維的開發也好不到哪裏,但是拒絕又有什麼用呢。只能硬着頭皮上了。畢竟逃避原本就不是什麼好的辦法!ubuntu
一、 cv2.imread():讀入圖片,共兩個參數 第一個參數爲要讀入的圖片文件名 第二個參數爲如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,幷包括其alpha通道 注意:若是當你輸入的路徑是錯誤的時候,程序也不會報錯,只是當時打印的時候值爲None 二、cv2.imshow():建立一個窗口顯示圖片,共兩個參數 第一個參數表示窗口名字,能夠建立多個窗口中,可是每一個窗口不能重名 第二個參數是讀入的圖片 三、cv2.waitKey():鍵盤綁定函數,共一個參數(若是你用的是64位的系統,寫成cv2.waitKey(0) & 0xFF) 表示等待毫秒數,將等待特定的幾毫秒,看鍵盤是否有輸入,返回值爲ASCII值。若是其參數爲0,則表示無限期的等待鍵盤輸入 四、cv2.destroyAllWindows():刪除創建的所有窗口 五、cv2.destroyWindows():刪除指定的窗口 六、cv2.imwrite():保存圖片,共兩個參數,第一個爲保存文件名,第二個爲讀入圖片
下面代碼中讀入的是什麼照片,保存就的到什麼照片,----彩色照片(即cv2.IMREAD_COLOR),是灰色照片(即cv2.IMREAD_GRAYSCALE)centos
import cv2 img = cv2.imread('meizi.png', cv2.IMREAD_COLOR) # 讀入彩色圖片 cv2.imshow('image', img) # 創建image窗口顯示圖片 k = cv2.waitKey(0) # 無限期等待輸入 print k if k == 27: # 若是輸入ESC退出 cv2.destroyAllWindows() elif k == ord('s'): # 若是輸入s,保存 cv2.imwrite('test.png', img) print "OK!" cv2.destroyAllWindows()
matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab類似的命令API,十分適合交互式地進行製圖。並且也能夠方便地將它做爲繪圖控件,嵌入GUI應用程序中。它的文檔至關完備,而且 Gallery頁面 中有上百幅縮略圖,打開以後都有源程序。所以若是你須要繪製某種類型的圖,只須要在這個頁面中瀏覽、複製、粘貼一下,基本上都能搞定。如今先大致的瞭解下,具體學習我會在後面繼續更新出來。。。數組
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('meizi.png',cv2.IMREAD_UNCHANGED) plt.imshow(img,cmap = 'gray',interpolation='bicubic') plt.xticks([]),plt.yticks([]) plt.show()
爲了獲取視頻,必須建立一個VideoCapture對象,它的參數可使設備的索引號(通常筆記本內置攝像頭的參數爲0,你也能夠設置爲別的數來選擇別的攝像頭),固然也可使視頻文件的名字服務器
import cv2 cap = cv2.VideoCapture(0) while True: ret,frame = cap.read() print ret gray = cv2.cvtColor(frame,cv2.IMREAD_GRAYSCALE) cv2.imshow('frame',gray) if cv2.waitKey(1) == 27: #按Esc退出 break cap.release() cv2.destroyAllWindows()
cap.read() 獲取一個元祖,元祖中第一個是布爾值,若是幀讀取的是正確的,就返回True,反之False。第二個值是一個數組,表明的應該是獲取到的視頻信息內容吧
cv.CvtColor() 將獲取的彩色圖像,轉換成灰度圖像
cv2.imshow() 建立一個窗口顯示圖片
注意:有時候cap可能不能成功的初始化攝像頭設備,這種狀況下上面的代碼會報錯。你可使用cap.isOpened()來檢查是否成功初始化,初始化成功則爲True
在咱們捕獲視頻,並對每一幀都進行加工以後咱們想要保存這個視頻,咱們須要建立一個VideoWriter對象,咱們應該肯定一個輸出文件的名字,播放頻率和幀也要肯定。
""" __author__ = '盧曉軍' __date__ = '2016/12/22' __Desc__ = 使用Python藉助opencv實現對圖像的讀取,寫入 """ import sys reload(sys) import cv2 import numpy as np sys.setdefaultencoding('utf8') # 選取攝像頭,0爲筆記本內置的攝像頭,1,2···爲外接的攝像頭 cap = cv2.VideoCapture(0) # cap.set(3,1080) # cap.set(4,720) # 爲保存視頻作準備 fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ") # 第三個參數則是鏡頭快慢的,20爲正常,小於二十爲慢鏡頭 out = cv2.VideoWriter('output2.avi', fourcc,3.0,(640,480)) while True: # 一幀一幀的獲取圖像 ret,frame = cap.read() if ret == True: frame = cv2.flip(frame, 1) #第二個參數小於1,攝像頭是反的,大於等於1是正常的 # 在幀上進行操做 # gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 開始保存視頻 out.write(frame) # 顯示結果幀 cv2.imshow("frame", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # 釋放攝像頭資源 cap.release() out.release() cv2.destroyAllWindows()
Fourcc 就是一個4字節碼,用來肯定視頻的編碼格式
一開始我是用的fourcc是:
fourcc = cv2.cv.FOURCC(*'XVID')
可是老是不能正確的錄製出視頻文件,顯示大小爲0KB。最後發現是電腦上沒有響應的視頻解碼庫致使的,解決辦法:
fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
import cv2 import numpy as np cap = cv2.VideoCapture("output2.avi") while True: ret, frame = cap.read() if frame == None: #最後讀取完 break cv2.imshow("capture", frame) if cv2.waitKey(120) == 27: # 按Esc退出 break cap.release() cv2.destroyAllWindows()
注意:若是cv2.waitKey()中的參數小於1的時候,畫面中止,就是屬於無限等待輸入,輸入的頻率越快,播放的速度就越快
學習使用OpenCV畫幾何圖形,主要的函數爲:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText等
上述幾個函數具備以下的相同類型的參數:
一、直線(左上角--右下角)
import numpy as np import cv2 img = np.zeros((512,512,3), np.uint8) cv2.line(img,(0,0),(511,511),(255,0,0),5) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv2.circle(img,(447,63), 63, (0,0,255), -1)
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) pts = pts.reshape((-1,1,2)) img2 = cv2.polylines(img,[pts],True,(0,255,255))
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX cv2.putText(img,'OpenCV',(10,500), font, 3,(255,255,255),2)
cv2.putText()中第一個參數爲背景圖片,第二個爲文本內容,第三個參數爲距離左邊框以及上邊框的像素數,第四個參數是文本字體的風格,第五個參數是同比例放大的倍數,第六個是組成文本的三原色,最後一個參數是字體加粗度
import numpy as np import cv2 events = [i for i in dir(cv2) if 'EVENT' in i] print events def draw_circle(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img, (x, y), 100, (255, 0, 0), -1) img = np.zeros((512, 512, 3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image', draw_circle) while (True): cv2.imshow('image', img) if cv2.waitKey(20) & 0xff == 27: break cv2.deltroyAllWindows()
import numpy as np import cv2 drawing = False mode = True ix, iy = -1, -1 def draw_circle(event, x, y, flags, param): global ix, iy, drawing, mode if event == cv2.EVENT_LBUTTONDOWN: print 'left button down' drawing = True ix, iy = x,y #elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON: elif event == cv2.EVENT_MOUSEMOVE: print 'mouse move' if drawing == True: if mode == True: cv2.rectangle(img, (ix, iy), (x,y), (0,255,0), -1) else: cv2.circle(img, (x, y), 10, (255,0,0), -1) elif event == cv2.EVENT_LBUTTONUP: print 'left button up' drawing = False img = np.zeros((512,512,3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image', draw_circle) while(True): cv2.imshow('image', img) k = cv2.waitKey(1)&0xff if k == ord('m'): print 'you typed key m' mode = not mode elif k == 27: break
持續更新中。。。。。。。。