opencv 震撼你的視覺-------基礎篇

opencv

   最近在作一個釣魚網站的項目中用到了一個叫opencv的玩意兒,之前沒接觸過。感受挺新鮮的,並且項目中要用,因此就問了一下度娘(是想Google一下的,顯得高大上and專業一點,可是英語水平實在是low),百度百科的解釋是這樣的(有點專業,讀完之後似懂非懂的感受,不過以爲這個東西很強勢,能夠搞一下):OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,能夠運行在Linux、Windows、Android和Mac OS操做系統上。它輕量級並且高效——由一系列 C 函數和少許 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的不少通用算法。html

下面咱們就一點一點來學習這個灰常牛逼的東西吧:python

Windows下安裝

源碼下載地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.exe/downloadlinux

安裝程序:http://jingyan.baidu.com/article/4dc408484c0ec0c8d946f180.htmlgit

linux下安裝

源碼下載地址:https://github.com/Itseez/opencv/archive/2.4.13.zipgithub

程序安裝:http://blog.csdn.net/csqingchen/article/details/43968925算法

一開始在centos上面裝(咱們的測試服務器),死活裝不上,不知爲什麼(若是有裝上的小夥伴能夠分享一下,真是不勝感激),但代碼最後是運行在ubuntu上面的,因此就勉爲其難的在本身本地裝了一個ubuntu的虛擬機來測試代碼,之前對什麼裝軟件,配環境這方面重視的不是很夠,對於這樣的任務一開始我是拒絕的,心中非常恐懼。確實,不會開發的運維終將被淘汰,不會運維的開發也好不到哪裏,但是拒絕又有什麼用呢。只能硬着頭皮上了。畢竟逃避原本就不是什麼好的辦法!ubuntu

圖片處理

1、主要函數

一、 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()

2、結合matplotlib

 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()

效果圖以下(使用matplotlib 顯示圖片,咱們能夠對圖片作一些處理,例如:縮放、調整位置,保存等的功能):

注意:以下圖所示,當咱們用opencv加載一個彩色圖片,並用matplotlib 顯示圖片的時候會遇到一些困難

視頻文件處理

 1、攝像頭捕獲視頻

 爲了獲取視頻,必須建立一個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

2、錄製保存視頻

在咱們捕獲視頻,並對每一幀都進行加工以後咱們想要保存這個視頻,咱們須要建立一個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", " ")

3、從文件中播放視頻

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繪圖操做

學習使用OpenCV畫幾何圖形,主要的函數爲:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText等

上述幾個函數具備以下的相同類型的參數:

  • img: 背景圖像
  • color: 形狀的顏色。格式爲BGR,是一個元組,如(255,0,0)表示藍色。若是是灰度圖像則只須要傳入灰度值。
  • thickness:厚度,默認值爲1,若是對封閉圖形傳入-1,則會填充整個圖形。
  • lineType: 線的類型,默認是8-連通,傳入cv2.LINE_AA則是反鋸齒,反鋸齒在畫曲線時看起來會更平滑。

1、畫線

一、直線(左上角--右下角)

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()中第一個參數爲背景圖片,第二個爲文本內容,第三個參數爲距離左邊框以及上邊框的像素數,第四個參數是文本字體的風格,第五個參數是同比例放大的倍數,第六個是組成文本的三原色,最後一個參數是字體加粗度

下圖就是這幾種圖形的一個組合:

2、鼠標事件

一、簡單入門

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

 

持續更新中。。。。。。。。

相關文章
相關標籤/搜索