opencv計算機視覺學習筆記一

第二章 處理文件 攝像頭和圖形用戶界面python

1 基本i/o腳本dom

讀寫圖像文件ide

示例代碼以下:函數

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 12:22 # @Author  : Retacn # @Site    : /寫圖像文件 # @File    : imageReadWrite.py # @Software: PyCharm import cv2
import numpy as np
from matplotlib import pyplot as plt

#色正方形圖像 img=np.zeros((3,3),dtype=np.uint8)
print(img)
#輸出內容以下: #[[0 0 0] # [0 0 0] # [0 0 0]] #查看圖像結構 print(img.shape)
#輸出結果 # (3, 3) #將圖像轉化成BGR img2=cv2.cvtColor(img,cv2.COLOR_BAYER_BG2BGR)
print(img2)
#輸出內容以下: #[[[0 0 0] #  [0 0 0] #  [0 0 0]] # # [[0 0 0] #  [0 0 0] #  [0 0 0]] # # [[0 0 0] #  [0 0 0] #  [0 0 0]]] #查看圖像結構 print(img2.shape)
#輸出結果爲: #(3, 3, 3) #png格式圖像轉換爲jpeg格式 image=cv2.imread('../j.png')
cv2.imwrite('../j.jpg',image)
#imread參數 # IMREAD_ANYCOLOR = 4 # IMREAD_ANYDEPTH = 2 # IMREAD_COLOR = 1 # IMREAD_GRAYSCALE = 0 灰度圖像 # IMREAD_LOAD_GDAL = 8 # IMREAD_UNCHANGED = -1 #顯示圖像 plt.subplot(221),plt.imshow(img)
plt.title("img"),plt.xticks([]),plt.yticks([])

plt.subplot(222),plt.imshow(img2)
plt.title("img2"),plt.xticks([]),plt.yticks([])

plt.subplot(223),plt.imshow(image)
plt.title("image"),plt.xticks([]),plt.yticks([])


plt.show()

 

圖像與原始字節之間的轉換ui

示例代碼以下:spa

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 12:48 # @Author  : Retacn # @Site    : 圖像與原始字節之間的轉換 # @File    : image2array.py # @Software: PyCharm import cv2
import numpy as np
import os
from matplotlib import pyplot as plt

#讀入圖像 img=cv2.imread('../test.jpg',cv2.IMREAD_GRAYSCALE)
print(img)
#顯示轉換爲標準一維python bytearray byteArray=bytearray(img)

img=cv2.imread('../test1.jpg')
byteArray1=bytearray(img)


#將字節轉換爲圖像 grayImage=np.array(byteArray).reshape(220,265)
bgrImage=np.array(byteArray1).reshape(800,480,3)

#將隨機字節轉換爲灰度圖像和BGR圖像 #建立隨機字節 randomByteArray=bytearray(os.urandom(120000))
flatNumpyArray=np.array(randomByteArray)

#將字節轉換爲400*300 的灰度圖像 ran_grayImage=flatNumpyArray.reshape(300,400)

#將字節轉換爲400*100BGR圖像 ran_bgrImage=flatNumpyArray.reshape(100,400,3)



#顯示圖像 plt.subplot(221),plt.imshow(grayImage)
plt.title("grayImage"),plt.xticks([]),plt.yticks([])

plt.subplot(222),plt.imshow(bgrImage)
plt.title("bgrImage"),plt.xticks([]),plt.yticks([])

plt.subplot(223),plt.imshow(ran_grayImage)
plt.title("ran_grayImage"),plt.xticks([]),plt.yticks([])

plt.subplot(224),plt.imshow(ran_bgrImage)
plt.title("ran_bgrImage"),plt.xticks([]),plt.yticks([])

plt.show()

 

 

Array訪問圖形數據設計

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 13:17 # @Author  : Retacn # @Site    : array訪問圖像數據 # @File    : arrayAccessImage.py # @Software: PyCharm import cv2
import numpy as np
from matplotlib import pyplot as plt

# 讀入圖像 img = cv2.imread('../test.jpg')
print(img[0, 0])
# 修改圖像數據 img[0, 0] = [255, 251, 251]
print(img[0, 0])

# 修改指定座標的顏色值 print(img.item(150, 120, 0))

img.itemset((150,120,0),255)
print(img.item(150, 120, 0))

#圖像徹底沒有綠色 img[:,:,1]=0

#將圖像的一部份複製到圖像的另外一個位置 img_j = cv2.imread('../test1.jpg')
my_roi=img_j[0:100,0:100]
img_j[200:300,200:300]=my_roi

#取得圖像屬性 print(img.shape)#寬度/高度/通道數 print(img.size)#圖像像素的大小 print(img.dtype)#圖像的數據類型 # 顯示圖像 plt.subplot(121), plt.imshow(img)
plt.title('change'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(img_j)
plt.title('img_j'), plt.xticks([]), plt.yticks([])

plt.show()

 

視頻文件的讀寫code

示例代碼以下:視頻

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 13:57 # @Author  : Retacn # @Site    : 視頻文件的讀寫 # @File    : videoRead.py # @Software: PyCharm import cv2

cameraCapture = cv2.VideoCapture('../test.avi')
FPS = 30
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH))
        , int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrite = cv2.VideoWriter('../testOut.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), FPS, size)

success, frame = cameraCapture.read()
while success:
    videoWrite.write(frame)
    success, frame = cameraCapture.read()
cameraCapture.release()

 

捕獲攝像頭的幀對象

示例代碼以下:

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 13:39 # @Author  : Retacn # @Site    : 捕獲攝像頭的幀 # @File    : videoReadWrite.py # @Software: PyCharm import cv2

# cameraCapture=cv2.VideoCapture(0)
FPS=30
size=(int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH))
      ,int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWrite=cv2.VideoWriter('../test.avi',cv2.VideoWriter_fourcc('I','4','2','0'),FPS,size)

success,frame=cameraCapture.read()
numFramesRemaining=10*FPS-1
while success and numFramesRemaining>0:
    videoWrite.write(frame)
    success,frame=cameraCapture.read()
    numFramesRemaining-=1
cameraCapture.release()

 

當須要同步一組攝像頭或是一個多頭攝像頭

success0=cameraCapture0.grab()
success1=cameraCapture1.grab()
if success0 and success1:
    frame0=cameraCapture0.retrieve()
    frame1=cameraCapture1.retrieve()

 

 

在窗口顯示圖像

示例代碼以下:

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 14:09 # @Author  : Retacn # @Site    : 在窗口顯示圖像 # @File    : imageShow.py # @Software: PyCharm import cv2
import numpy as np

img=cv2.imread('../test.jpg')
cv2.imshow('Image',img)
cv2.waitKey()
cv2.destroyAllWindows()

 

在窗口顯示攝像頭幀

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 14:13 # @Author  : Retacn # @Site    : 在窗口顯示攝像頭幀 # @File    : videoCamera.py # @Software: PyCharm import cv2
import numpy as np

clicked=False def onMouse(event,x,y,flags,param):
    global clicked
    if event==cv2.EVENT_LBUTTONUP:#左健擡起         clicked=True cameraCapture=cv2.VideoCapture(0)
cv2.namedWindow("VideoWindow")
cv2.setMouseCallback('VideoWindow',onMouse)

print('Showing camera feed,Click window or press any key to stop.')
success,frame=cameraCapture.read()
while success and cv2.waitKey(1)==-1 and not clicked:
    cv2.imshow('VideoWindow',frame)
    success,frame=cameraCapture.read()

cv2.destroyWindow('VideoWindow')
cameraCapture.release()

 

2 cameo項目

 

3 cameo面向對象的設計

Managers.py文件

示例代碼以下:

#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/28 13:30 # @Author  : Retacn # @Site    : 面向對象的設計 # @File    : cameo.py # @Software: PyCharm import cv2
import numpy as np
import time


'''     視頻管理 ''' class CaptureManager(object):
    def __init__(self,
                 capture, #攝像頭通道                  previewWindowManager=None,#窗口管理器                  shouldMirrorPreview=False):#攝像頭預覽的鏡像選項         self.previewWindowManager=previewWindowManager
        self.shouldMirrorPreview=shouldMirrorPreview

        #定義非公有變量,單下劃線開始,爲保護變量,只有類對象或子類對象能夠訪問 protected         #若是以雙下劃線開始,爲私有成員變量,只有類對象自已能夠訪問,private         self._capture=capture
        self._channel=0
        self._enteredFrame=False         self._frame=None         self._imageFilename=None         self._videoFilename=None         self._videoEncoding=None         self._videoWriter=None         self.startTime=None         self._framesElapsed=int(0)
        self._fpsEstimate=None     @property
    def channel(self):
        return self._channel

    @channel.setter
    def channel(self,value):
        if self._channel!=value:
            self._channel=value
            self._frame=None     @property
    def frame(self):
        if self._enteredFrame and self._frame is None:
            _,self._frame=self._capture.retrieve()
        return self._frame

    @property
    def isWritingImage(self):
        return self._imageFilename is not None     @property
    def isWritingVideo(self):
        return self._videoFilename is not None     #只能同步一幀     def enterFrame(self):

        assert not self._enteredFrame, \
            'previous enterFrame() had no matching exitFrame()'         if self._capture is not None:
            self._enteredFrame=self._capture.grab()

    #能夠從當前通道中取得圖像,估計幀率,顯示圖像,執行暫停的請求,向文件中寫入圖像     def exitFrame(self):
        if self.frame is None:
            self._enteredFrame=False             return         #計算幀率         if self._framesElapsed==0:
            self._startTime=time.time()
        else:
            timeElapsed=time.time()-self._startTime
            self._fpsEstimate=self._framesElapsed/timeElapsed

        self._framesElapsed+=1

        #經過窗體顯示圖像         if self.previewWindowManager is not None:
            if self.shouldMirrorPreview:
                mirroredFrame=np.fliplr(self._frame).copy()
                self.previewWindowManager.show(mirroredFrame)
            else:
                self.previewWindowManager.show(self._frame)

        #保存圖像文件         if self.isWritingImage:
            cv2.imwrite(self._imageFilename,self._frame)
            self._imageFilename=None         #保存視頻文件         self._writeVideoFrame()

        #釋放資源         self._frame=None         self._enteredFrame=False     #保存圖片,公有函數     def writeImage(self,filename):
        self._imageFilename=filename

    #開始保存視頻,公有函數     def startWritingVideo(self,filename,encoding=cv2.VideoWriter_fourcc('I','4','2','0')):
        self._videoFilename=filename
        self._videoEncoding=encoding

    #中止視頻寫入,公有函數     def stopWritingVideo(self):
        self._videoFilename=None         self._videoEncoding=None         self._videoWriter=None     #寫入視頻幀     def _writeVideoFrame(self):
        if not self.isWritingVideo:
            return         if self._videoWriter is None:
            fps=self._capture.get(cv2.CAP_PROP_FPS)
            if fps==0.0:
                if self._framesElapsed<20:
                    return                 else:
                    fps=self._fpsEstimate
            size=(int(self._capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
                  int(self._capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

            self._videoWriter=cv2.VideoWriter(self._videoFilename,
                                              self._videoEncoding,
                                              fps,
                                              size)
        self._videoWriter.write(self._frame)

'''     窗口管理,支持鍵盤事件 ''' class WindowManager(object):

    def __init__(self,
                 windowName,#窗體名稱                  keypressCallback=None):#按鍵回調函數         self.keypressCallback=keypressCallback

        self._windowName=windowName
        self._isWindowCreate=False     #檢查窗體是否被建立     @property
    def isWindowCreated(self):
        return self._isWindowCreate

    #建立窗體     def createWindow(self):
        cv2.namedWindow(self._windowName)
        self._isWindowCreate=True     #顯示圖像     def show(self,frame):
        cv2.imshow(self._windowName,frame)

    #關閉窗體釋放資源     def destroyWindow(self):
        cv2.destroyWindow(self._windowName)
        self._isWindowCreate=False     #處理鍵盤事件     def processEvents(self):
        keycode=cv2.waitKey(1)
        if self.keypressCallback is not None and keycode!=-1:
            keycode&=0xFF #ESC 退出             self.keypressCallback(keycode)


cameo.py文件
示例代碼以下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/28 14:45 # @Author  : Retacn # @Site    : cameo實現,有兩種啓動方法: run()  onkeypress() # @File    : cameo.py.py # @Software: PyCharm import cv2
from Two.cameo.managers import WindowManager,CaptureManager

class Cameo(object):

    def __init__(self):
        self._windowManager=WindowManager('Cameo',self.onkeypress)

        self._captureManager=CaptureManager(cv2.VideoCapture(0),self._windowManager,True)

    def run(self):
        self._windowManager.createWindow()
        while self._windowManager.isWindowCreated:
            self._captureManager.enterFrame()
            frame=self._captureManager.frame

            self._captureManager.exitFrame()
            self._windowManager.processEvents()

    def onkeypress(self,keycode):
        '''             space-> 載圖             tab->啓動和中止視頻錄製             esc->退出應用         :param keycode:         :return:         '''         if keycode==32:#space             self._captureManager.writeImage('screenshot.png')
        elif keycode==9:#tab             if not self._captureManager.isWritingVideo:
                self._captureManager.startWritingVideo('screencast.avi')
            else:
                self._captureManager.stopWritingVideo()
        elif keycode==27:#esc             self._windowManager.destroyWindow()
if __name__=='__main__':
    Cameo().run()
相關文章
相關標籤/搜索