Monday, June 29, 2015

opencv背景相減法

  • 背景減除(BS)是一種常見和廣泛使用的技術,用於產生前景,移動中的物體的像素的二值圖像,通過使用靜態相機。
  • 正如其名稱所暗示的,BS計算執行當前影像和背景模型之間的影像做減法。
  • 把攝像頭捕捉的圖像第一幀作为背景,以後的每一幀都減去背景幀,這样減去之後剩下的就是多出來的特征物體(要偵測的物體)的部分。
  • 背景建模包括兩個主要步驟:
    1. 後台初始化
    2. 背景更新



import numpy as np
import cv2

cap = cv2.VideoCapture(0)

fgbg = cv2.BackgroundSubtractorMOG()

while(1):
    ret, frame = cap.read()

    fgmask = fgbg.apply(frame)

    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

參考資料:
http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html
http://docs.opencv.org/master/d1/dc5/tutorial_background_subtraction.html

Saturday, June 27, 2015

過慮顏色取得想判別的顏色

將圖像從彩色轉換為灰階,BGR<->Gray,BGR<->HSV
用HSV分離顏色
H:色相 0~179
S:飽和度 0~255
V:明度 0~255
 對於色彩轉換的方法,我們用兩個最廣泛的函式:
cv2.cvtColor():BGR轉換到HSV
cv2.inRange():只顯示設定範圍內的顏色

import cv2
import numpy as np
#create a VideoCapture object
cap = cv2.VideoCapture(0)

while(1):

    # Capture Video from Camera
    _, frame = cap.read()

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # define range of green color in HSV 
    lower_green = np.array([50,100,100])
    upper_green = np.array([70,255,255])

    # define range of red color in HSV 
    lower_red = np.array([-10,100,100])
    upper_red = np.array([10,255,255])

    # Threshold the HSV image to get only blue colors
    mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
    # Threshold the HSV image to get only green colors
    mask_green = cv2.inRange(hsv, lower_green, upper_green)
    # Threshold the HSV image to get only red colors   
    mask_red = cv2.inRange(hsv, lower_red, upper_red)
    # Bitwise-AND mask and original image

    res_blue = cv2.bitwise_and(frame,frame, mask= mask_blue)
    res_green = cv2.bitwise_and(frame,frame, mask= mask_green)
    res_red = cv2.bitwise_and(frame,frame, mask= mask_red)
    cv2.imshow('frame',frame)
    cv2.imshow('mask_blue)',mask_blue)
    cv2.imshow('mask_green',mask_green)
    cv2.imshow('mask_red',mask_red)

    cv2.imshow('res_blue',res_blue)
    cv2.imshow('res_green',res_green)
    cv2.imshow('res_red',res_red)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
參考資料:

圖片處理

1cv2.imread()讀入圖片,共兩個參數,第一個參數為要讀入的圖片文件名 ​​,第二個參數為如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,並包括其alpha通道。
2cv2.imshow()創建一個窗口顯示圖片,共兩個參數,第一個參數表示窗口名字,可以創建多個窗口中,但是每個窗口不能重名;第二個參數是讀入的圖片。
3cv2.waitKey():鍵盤綁定函數,共一個參數,表示等待毫秒數,將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數為0,則表示無限期的等待鍵盤輸入。
4cv2.destroyAllWindows():刪除建立的全部窗口。
5cv2.destroyWindows():刪除指定的窗口。
6cv2.imwrite():保存圖片,共兩個參數,第一個為保存文件名 ​​,第二個為讀入圖片。
import cv2
import numpy as np 

img=cv2.imread("cat.jpg")
emptyImage1 = cv2.GaussianBlur(img, (5,5),0)
emptyImage2 = img.copy()
emptyImage3 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#turn gray 
#emptyImage3[...]=0

#Window display image
cv2.imshow("Image1",emptyImage1)
cv2.imshow("Image2",img)
cv2.imshow("Image3",emptyImage2)
cv2.imshow("Image4",emptyImage3)
#save image
cv2.imwrite("./cat1.png",img,[int(cv2.IMWRITE_PNG_COMPRESSION), 0])   
cv2.imwrite("./cat2.png",img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])  
k=cv2.waitKey(0)
#Press ESC to leave
if k==27:
 cv2.destroyAllWindows("Image1")  

參考資料: