2.影像的載入與儲存

小郭學資料發表於2020-11-04

學習視訊可參見python+opencv3.3視訊教學 基礎入門

今天寫的是影像,視訊的載入與儲存

1.影像,數字影像,畫素

1.影像

  • 影像:定義為二維函式f(x,y),其中,x,y是空間座標,f(x,y)是點(x,y)的幅值
  • 灰度影像:是一個二維灰度(或亮度)函式f(x,y)
  • 彩色影像:由三個(如RGB,HSV)二維灰度(或亮度)函式
    • RGB:R,紅,G,綠,B,藍
    • HSV:H,色調,S,飽和度,V:明度

2.數字影像

  • 數字影像:畫素組成的二維排列,可以用矩陣表示
  • 單色(灰度)影像:每個畫素的亮度用一個數值來表示,通常數值範圍在0-255,0表示黑,255表示白,其它值表示處於黑白之間的灰度
  • 彩色影像:用紅,綠,藍三元組的二維矩陣表示,通常,三元組的每個數值也是在0-255之間,0表示相應的基色在該畫素中沒有,255則代表相應的基色在該畫素中取得最大值

3.畫素

數字影像由二維元素組成,每一個元素具有一個特定位置(x,y)和幅值f(x,y),這些元素就稱為畫素

image-20201104103017413

2.影像資訊獲得

def get_image_info(image):
    print("影像型別:",type(image))
    print("影像長x寬x通道數:",image.shape)
    print("影像長寬通道數相乘所得值:",image.size)
    print("影像畫素值型別:",image.dtype)
    pixel_data = np.array(image)  # 將圖片轉換成陣列
    print("畫素大小:", pixel_data)

結果輸出

影像型別: <class 'numpy.ndarray'>
影像長x寬x通道數: (512, 512, 3)
影像長寬通道數相乘所得值: 786432
影像畫素值型別: uint8
畫素大小: [[[128 138 225]
  [127 137 224]
  [126 136 223]
  ...
  [ 81  68 178]
  [ 83  71 183]
  [ 84  74 188]]]

3.彩色圖轉灰度圖

def save_image(image):
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) # 將image圖片轉換成灰度圖
    cv.imwrite("huidu.png",gray)  #將轉換後的圖片儲存為huidu.png
    cv.imshow("gray",gray)

原圖與灰度圖對比:

image-20201104103038093

4.獲取視訊

# 獲取視訊
def video_demo():
    capture = cv.VideoCapture(0) #0指筆記本的內建攝像頭,可以設定成1或其他的來選擇成別的攝像頭
    print("型別",type(capture))
    while True:
        ret, frame = capture.read()  # 獲取相機影像,返回ret(結果為True/False),和每一幀圖片
        frame = cv.flip(frame, 1)  # 將圖片水平翻轉,豎直翻轉為0
        print('1', ret)  # 列印出ret值
        cv.imshow("video", frame)  # 將每一幀圖片放入video視窗
        c = cv.waitKey(50) # 等有鍵輸入(這裡指c=Esc鍵)或者50ms後自動將視窗消除
        if c == 27: #如果按esc退出的話,這裡必須是等於27,27是esc的ASCLL十進位制表示
            break

5.視訊儲存

def save_video():
    cap = cv.VideoCapture(0)
    #FourCC是用於指定視訊編解碼器的4位元組程式碼
    #在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG會生成大尺寸的視訊。X264會生成非常小的尺寸的視訊)
    #在Windows中:DIVX(尚待測試和新增)
    #在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
    fourcc = cv.VideoWriter_fourcc('D', 'I','V', 'X')
    # 引數說明:輸出視訊名稱,編碼格式,播放頻率,幀的大小
    out = cv.VideoWriter("../images/xiaoguo.avi", fourcc, 50.0, (640, 480))
    while cap.isOpened(): # 你可以使用 cap.isOpened(),來檢查是否成功初始化了
        ret, frame = cap.read()
        if ret is True:
            out.write(frame)
            cv.imshow('frame', frame)
            if cv.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break

    cap.release()
    out.release()
  • cv.waitKey(1) & 0xFF == ord(‘key’):
    • 功能:若鍵盤輸入'key',視訊停止錄製並儲存
    • 引數:
      1:表示延時1ms切換到下一幀影像,對於視訊而言;
      0:只顯示當前幀影像,相當於視訊暫停;
      key:要輸入鍵盤的鍵
    • 返回值:ord(’ ')將字元轉化為對應的整數(ASCII碼)
  • 科普
    • 視訊中每一幀代表一幅影像
    • 幀的大小也就是影像的的大小即影像的寬,高

OpenCv中讀取的視訊是沒有聲音的

結語

以上內容僅是自我學習時記錄的筆記,歡迎大家批評指正,一起學習進步。迎大家關注我的公眾號小郭學資料在這裡插入圖片描述

相關文章