在Ubuntu開發OpenCV Python程式

Ubuntu安裝python2的OpenCV套件
sudo apt-get install python-numpy python-opencv 


顯示test.jpg圖片如果有參數,就用參數上的圖片
#!/usr/bin/python
import sys
import os.path
import cv2

if __name__ == '__main__':
    win_name = "Image Window"
    img_path = "test.jpg"
    argc = len(sys.argv)
    if argc > 1:
        img_path = sys.argv[1]
    if not os.path.exists(img_path):
        print 'File not found, path=\'', img_path, '\''
        quit(-1)
    print 'Show the image in the path=\'', img_path, '\''
    img = cv2.imread(img_path)
    if img is None:
        print 'Not supported image type!'
        quit(-1)
    cv2.namedWindow(win_name)
    cv2.imshow(win_name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

OpenCV的imread有第2的參數是指定讀取圖檔的方式,預設是讀取成彩色圖
要指定讀取成彩色圖,會獲得img的Type會是三個Channel的CV_8UC3
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
讀取成灰階圖,彩色圖片會自動被轉換成灰階圖,並Type會是單Channel的CV_8U
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) 
讀取原始,如果要使用png和tiff的Alpha層資料就需要用下面這參數
img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)

另外還有我沒測試過的參數
cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH

讀取圖檔後測試type
print 'test type(img)=', type(img)
我們將得到
test type(img)=
表示img後續的操作,大部份可以套用numpy套件來處理

    print 'test type(img)=', type(img)
    print 'test image.shape=', img.shape
    print '     image.size=', img.size
    print '     image.dtype=', img.dtype
    print '     image.ndim=', img.ndim
    print '     image.strides=', img.strides
    print '     type(image.shape)=', type(img.shape)
    for d in range(0, img.ndim):
        print '     dim(', d, ')=', (img.shape[d])
參考資料: 基本的numpy資訊

在imshow之前寫的namedWindow函數就算拿掉,整個小程式還是會做事情,不過你會發現有時無法做大小的調整,並且在你寫一個小程式使用多個Window時,你無法指定所想要繪製的Window,所以我們還是會加上namedWindow來指定名稱和設定視窗屬性,例如預設是用WINDOW_AUTOSIZE,不讓使用者改變視窗大小,如果圖片大於電腦螢幕可容許的範圍,會被縮小處理
cv2.namedWindow(win_name, cv2.WINDOW_AUTOSIZE)
WINDOW_NORMAL可以讓使用者改變視窗,不過預設的大小不見得會是圖片本來的大小
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)

最後的destroyAllWindows是在整個程式結束前關閉所有視窗,如果只是要關閉某一個視窗,只需要
指定window名稱呼叫cv2.destroyWindow(win_name)


參考資料:

留言