Chapter 2 處理文件失驶、攝像頭及圖形用戶界面--基本IO腳本

2.1 基本IO腳本

2.1.1 讀/寫圖像文件

主要關(guān)注顏色空間變換


def convertColorSpace():

    """"

    圖像顏色空間轉(zhuǎn)換

   """

    # 創(chuàng)建3*3大小的黑色正方形圖像

    img = np.zeros((3, 3), dtype=np.uint8)

    print('Black Image\n', img)

    # 將灰度圖轉(zhuǎn)化為BGR顏色空間的彩色圖,輸出為三通道

    img = cv.cvtColor(img, cv.COLOR_GRAY2BGR)

    print('BGR Image\n', img)

  1. 讀寫圖片:OpenCV中的imread()函數(shù)和imwrite()函數(shù)(支持靜態(tài)圖像文件格式,不同系統(tǒng)支持的文件格式不一樣,但都支持BMP格式由桌,通常還支持PNG\JPEG和TIEF格式)
  2. 主要關(guān)注讀取圖片時,原圖片和讀取后數(shù)據(jù)的變化,及寫入圖片時位深和透明通道的處理
def readWriteImage():
    """ 讀寫圖片
    imread()函數(shù)行您,默認(rèn)情況下铭乾,即使圖片為灰度圖,依舊返回BGR格式的圖片
    (除IMREAD_UNCHANGED娃循,IMREAD_LOAD_GDAL情況下炕檩,會刪除alpha通道信息)
    其可選參數(shù)flags:
    IMREAD_UNCHANGED = -1               用圖片的原來格式打開,     位深不變,          通道數(shù)不變
    IMREAD_GRAYSCALE = 0                用灰度圖像的方式打開圖片捌斧, 位深8bit,          通道數(shù)1
    IMREAD_COLOR = 1                    用彩色圖像打開圖片笛质,       位深8bit,          通道數(shù)3
    IMREAD_ANYDEPTH = 2                 用灰度圖像的方式打開圖片, 位深不變骤星,          通道數(shù)1
    IMREAD_ANYCOLOR = 4                 用圖片的原來格式打開经瓷,     位深8bit,          通道數(shù)不變但<=3
    IMREAD_LOAD_GDAL = 8                使用GDAL驅(qū)動讀取文件,      位深不變,         通道數(shù)不變
    """
    # 圖片原始位深位16位洞难,4通道數(shù)
    imgPath = './images/img1.png'
    # 默認(rèn)情況
    img = cv.imread(imgPath)
    print('默認(rèn)情況:', '位深', img.dtype, '舆吮,通道數(shù)', img.shape)

    # IMREAD_UNCHANGED
    img = cv.imread(imgPath, cv.IMREAD_UNCHANGED)
    print('IMREAD_UNCHANGED:', '位深', img.dtype, ',通道數(shù)', img.shape)

    # IMREAD_GRAYSCALE
    img = cv.imread(imgPath, cv.IMREAD_GRAYSCALE)
    print('IMREAD_GRAYSCALE:', '位深', img.dtype, '队贱,通道數(shù)', img.shape)

    # IMREAD_COLOR
    img = cv.imread(imgPath, cv.IMREAD_COLOR)
    print('IMREAD_COLOR:', '位深', img.dtype, '色冀,通道數(shù)', img.shape)

    # IMREAD_ANYDEPTH
    img = cv.imread(imgPath, cv.IMREAD_ANYDEPTH)
    print('IMREAD_ANYDEPTH:', '位深', img.dtype, ',通道數(shù)', img.shape)

    # IMREAD_ANYCOLOR
    img = cv.imread(imgPath, cv.IMREAD_ANYCOLOR)
    print('IMREAD_ANYCOLOR:', '位深', img.dtype, '柱嫌,通道數(shù)', img.shape)

    # IMREAD_LOAD_GDAL
    img = cv.imread(imgPath, cv.IMREAD_LOAD_GDAL)
    print('IMREAD_LOAD_GDAL:', '位深', img.dtype, '锋恬,通道數(shù)', img.shape)
    # print(img[:, : 3])

    # 寫入16位深,通道數(shù)4的圖像數(shù)據(jù)编丘,返回bool值
    # JPG与学、BMP存儲的視頻是unit8位深 RGB編碼的,寫入時將RGB三通道都用depth填充
    # PNG允許每個通道8位位深或16位位深
    cv.imwrite('./images/MyErrorJPGImg1.jpg', img)
    cv.imwrite('./images/MySucceedPNGImg1.png', img)
    # 位深分離嘉抓,16位->8位
    cv.imwrite('./images/MySucceedJPGImg1.jpg', img // 255)

2.1.2 圖像與原始字節(jié)之間的轉(zhuǎn)換

主要就是形狀的變化索守,reshape

def rawBytesImage():
    # 返回隨機(jī)字節(jié)
    randomByteArray = bytearray(os.urandom(120000))
    flatNumpyArray = np.array(randomByteArray)
    # 將字節(jié)數(shù)組轉(zhuǎn)換為400*300的灰度圖片
    grayImg = flatNumpyArray.reshape((300, 400))
    cv.imwrite('./images/RandomGray.png', grayImg)
    # 將字節(jié)數(shù)組轉(zhuǎn)換為400*100*3的彩色圖片
    colorImg = flatNumpyArray.reshape((100, 400, 3))
    cv.imwrite('./images/RandomColor.png', colorImg)

2.1.3 使用numpy.array訪問圖像數(shù)據(jù)

以前沒注意item用法,但索引用法更方便和趁手抑片,切片對區(qū)域的操作也更友好卵佛,時間無差

def acccessImageData():
    # 使用item的方式
    img = cv.imread('./images/img1.png')
    print(img.item(150, 120, 0))
    itemStart = time.time()
    img.itemset((150, 120, 0), 255)
    itemEnd = time.time()
    print(img.item(150, 120, 0), 'itme time is', itemEnd - itemStart)

    # 使用索引和切片的方式
    sliceStart = time.time()
    img[150,120, 0] = 254
    sliceEnd = time.time()
    print(img.item(150, 120, 0), 'itme time is', sliceEnd - sliceStart)

2.1.4 視頻文件的讀/寫

OpenCV提供VideoCapture類和VideoWriter類支持各種格式的視頻文件,
文件指針到達(dá)文件末尾前敞斋,VideroCapture的read()函數(shù)獲取新幀
主要關(guān)注讀寫函數(shù)截汪,視頻幀率、尺寸的獲取與設(shè)置植捎,及視頻編碼操作

def videoReadWrite():
    """
    cv.VideoWriter_fourcc('I','4','2','0')           = 未壓縮YUV顏色編碼衙解,4:2:0色度子采樣
    cv.VideoWriter_fourcc('M','J','P','G')           = motion-jpeg 編碼
    cv.VideoWriter_fourcc('P','I','M','1')           = MPEG-1 編碼
    cv.VideoWriter_fourcc('M', 'P', '4', '2')        = MPEG-4.2 編碼
    cv.VideoWriter_fourcc('D', 'I', 'V', '3')        = MPEG-4.3 編碼
    cv.VideoWriter_fourcc('D', 'I', 'V', 'X')        = MPEG-4 編碼
    cv.VideoWriter_fourcc('U', '2', '6', '3')        = H263 編碼
    cv.VideoWriter_fourcc('I', '2', '6', '3')        = H263I 編碼
    cv.VideoWriter_fourcc('F', 'L', 'V', '1')        = FLV1 編碼
    """
    # 參數(shù)為0時,表示攝像頭設(shè)備0
    videoFile = cv.VideoCapture('./videos/test.mp4')
    success, frame = videoFile.read()
    # 獲取視頻幀率
    fps = videoFile.get(cv.CAP_PROP_FPS)
    # 獲取視頻尺寸
    size = (int(videoFile.get(cv.CAP_PROP_FRAME_WIDTH)), int(videoFile.get(cv.CAP_PROP_FRAME_HEIGHT)))
    # 寫入新視頻文件中焰枢,cv.VideoWriter_fourcc('F', 'L', 'V', '1')指定視頻編碼
    videoWriter = cv.VideoWriter('./videos/ccNew.flv', cv.VideoWriter_fourcc('F', 'L', 'V', '1'), fps, size)

    while success:
        videoWriter.write(frame)

        success, frame = videoFile.read()

2.1.5 捕獲攝像頭的幀

def capFromCam():
    cap = cv.VideoCapture(0)
    # 假設(shè)幀率為30
    fps = 25
    # 獲取視頻尺寸
    size = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
    # 寫入新視頻文件中丢郊,cv.VideoWriter_fourcc('F', 'L', 'V', '1')指定視頻編碼
    videoWriter = cv.VideoWriter('./videos/capFromCam.flv', cv.VideoWriter_fourcc('F', 'L', 'V', '1'), fps, size)

    success, frame = cap.read()
    # 存儲10秒的攝像頭圖像
    numFramRema = 10 * fps - 1
    while success and numFramRema > 0:
        videoWriter.write(frame)
        success, frame = cap.read()
        numFramRema -= 1
    cap.release()
# 兩個攝像頭
def multiCam():
    cap0 = cv.VideoCapture(0)
    cap1 = cv.VideoCapture(1)
    success0 = cap0.grab()
    success1 = cap1.grab()

    if success0 and success1:
        print("沒有兩個攝像頭")
        frame0 = cap0.retrieve()
        frame1 = cap1.retrieve()

    if success0:
        print('捕捉到攝像頭0')
        su, frame0 = cap0.retrieve()
        cap0.release()
        cv.imshow('cam1', np.asarray(frame0))
        cv.waitKey()
        # cv2.destroyAllWindows()

2.1.7 在窗口顯示攝像頭幀

def showCamFrame():
    clicked = False
    # 鼠標(biāo)點(diǎn)擊事件回調(diào)
    def onMouse(event, x, y, flags, param):
        global clicked
        if event == cv.EVENT_LBUTTONUP:
            clicked = True
            print(clicked)


    cap = cv.VideoCapture(0)
    cv.namedWindow('Myself')
    cv.setMouseCallback('Myself', onMouse)
    print('點(diǎn)擊窗口或按任意鍵退出')

    sucess, frame = cap.read()
    while sucess and cv.waitKey(1) == -1 and not clicked:
        cv.imshow('Myself', frame)
        sucess, frame = cap.read()
    cv.destroyAllWindows()
    cap.release()

參考自《OpenCV3計算機(jī)視覺 Python語言實(shí)現(xiàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盔沫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枫匾,更是在濱河造成了極大的恐慌架诞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干茉,死亡現(xiàn)場離奇詭異谴忧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)角虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門沾谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戳鹅,你說我怎么就攤上這事均驶。” “怎么了枫虏?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵妇穴,是天一觀的道長。 經(jīng)常有香客問我隶债,道長腾它,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任死讹,我火速辦了婚禮瞒滴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赞警。我一直安慰自己妓忍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布愧旦。 她就那樣靜靜地躺著单默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忘瓦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天引颈,我揣著相機(jī)與錄音耕皮,去河邊找鬼。 笑死蝙场,一個胖子當(dāng)著我的面吹牛凌停,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播售滤,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罚拟,長吁一口氣:“原來是場噩夢啊……” “哼台诗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赐俗,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤拉队,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阻逮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱快,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年叔扼,在試婚紗的時候發(fā)現(xiàn)自己被綠了事哭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓜富,死狀恐怖鳍咱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情与柑,我是刑警寧澤谤辜,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仅胞,受9級特大地震影響每辟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜干旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一渠欺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椎眯,春花似錦挠将、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掌测,卻和暖如春内贮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汞斧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工夜郁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粘勒。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓竞端,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庙睡。 傳聞我的和親對象是個殘疾皇子事富,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容