1. 程式人生 > >opencv計算機視覺學習筆記一

opencv計算機視覺學習筆記一

第二章 處理檔案 攝像頭和圖形使用者介面

1 基本i/o指令碼

讀寫影象檔案

示例程式碼如下:

#!/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()

影象與原始位元組之間的轉換

示例程式碼如下:

#!/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()

視訊檔案的讀寫

示例程式碼如下:

#!/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()

相關推薦

opencv計算機視覺學習筆記

第二章 處理檔案 攝像頭和圖形使用者介面 1 基本i/o指令碼 讀寫影象檔案 示例程式碼如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2016/11/27 12:22 # @Author  :

opencv計算機視覺學習筆記

第六章 影象檢索以及基於影象描述符的搜尋 通過提取特徵進行影象的匹配與搜尋 1 特徵檢測演算法 常見的特徵和提取演算法: Harris 檢測角點 Sift 檢測斑點(blob) 有專利保護 Surf 檢測斑點   有專利保護 Fast 檢測角點 Brief 檢測斑點 Or

opencv計算機視覺學習筆記

第八章 目標跟蹤 1檢測目標的移動 基本的運動檢測,示例程式碼如下: import cv2 import numpy as np # 捕獲攝像頭影象 camera = cv2.VideoCapture(0) # es = cv2.getStructuringEleme

)影象座標:我想和世界座標談談(A) 【計算機視覺學習筆記--雙目視覺幾何框架系列】

     玉米竭力用輕鬆具體的描述來講述雙目三維重建中的一些數學問題。希望這樣的方式讓大家以一個輕鬆的心態閱讀玉米的《計算機視覺學習筆記》雙目視覺數學架構系列部落格。這個系列部落格旨在捋順一下已標定的雙目視覺中的數學主線。數學推導是有著幾分枯燥的,但奇妙的計算機視覺世界

opencv3計算機視覺學習筆記-詞袋+svm

BOW實現步驟: 1.建立詞彙(特徵)詞典 2.得到訓練資料到字典的對映 3.選擇適當的分類器進行訓練 4.對新來的樣本,先對映到字典空間,然後利用得到的分類器進行分類 1.建立詞彙(特徵)詞典 以SIFT 128維特徵作為例子。例如現在有1000張訓練圖片,對每一

OpenCV計算機視覺學習(1)——影象基本操作(影象視訊讀取,ROI區域擷取,常用cv函式解釋)

1,計算機眼中的影象   我們開啟經典的 Lena圖片,看看計算機是如何看待圖片的:    我們點選圖中的一個小格子,發現計算機會將其分為R,G,B三種通道。每個通道分別由一堆0~256之間的數字組成,那OpenCV如何讀取,處理圖片呢,我們下面詳細學習。 2,影象的載入,顯示和儲存   我們看

OpenCV計算機視覺學習(2)——影象算術運算 & 掩膜mask操作(數值計算,影象融合,邊界填充)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   在OpenCV中我們經常會遇到一個名字:Mask(掩膜)。很多函式都使用到它,那麼這個Mask到底是

OpenCV計算機視覺學習(3)——影象灰度線性變換與非線性變換(對數變換,伽馬變換)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   下面主要學習影象灰度化的知識,結合OpenCV呼叫 cv2.cvtColor()函式實現影象灰度化,

OpenCV計算機視覺學習(4)——影象平滑處理(均值濾波,高斯濾波,中值濾波,雙邊濾波)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   “平滑處理”(smoothing)也稱“模糊處理”(bluring),是一項簡單且使用頻率很高的影象

OpenCV計算機視覺學習(5)——形態學處理(腐蝕膨脹,開閉運算,禮帽黑帽,邊緣檢測)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   形態學操作簡單來說,就是改變物體的形狀,下面學習一下,首先本文的目錄如下: 1,定義結構元素 2,

OpenCV計算機視覺學習(7)——影象金字塔(高斯金字塔,拉普拉斯金字塔)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   本節學習影象金字塔,影象金字塔包括高斯金字塔和拉普拉斯金字塔。它是影象中多尺度表達的一種,最主要用於

OpenCV計算機視覺學習(8)——影象輪廓處理(輪廓繪製,輪廓檢索,輪廓填充,輪廓近似)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice 1,簡單幾何影象繪製   簡單幾何影象一般包括點,直線,矩陣,圓,橢圓,多邊形等等。   下面學習一下

OpenCV計算機視覺學習(9)——影象直方圖 & 直方圖均衡化

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice 1,如何提高影象畫素   對曝光過度或者逆光拍攝的圖片可以通過直方圖均衡化的方法用來增強區域性或者整體的

OpenCV計算機視覺學習(10)——影象變換(傅立葉變換,高通濾波,低通濾波)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   在數字影象處理中,有兩個經典的變換被廣泛應用——傅立葉變換和霍夫變化。其中,傅立葉變換主要是將時間域

OpenCV計算機視覺學習(11)——影象空間幾何變換(影象縮放,影象旋轉,影象翻轉,影象平移,仿射變換,映象變換)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   影象的幾何變換是在不改變影象內容的前提下對影象畫素進行空間幾何變換,主要包括了影象的平移變換,縮放,

OpenCV計算機視覺學習(12)——影象量化處理&影象取樣處理(K-Means聚類量化,區域性馬賽克處理)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice 準備:影象轉陣列,陣列轉影象   將RGB影象轉換為一維陣列的程式碼如下: # 影象二維畫素轉換為一維

OpenCV計算機視覺學習(13)——影象特徵點檢測(Harris角點檢測,sift演算法)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice 前言   特徵點檢測廣泛應用到目標匹配,目標跟蹤,三維重建等應用中,在進行目標建模時會對影象進行目標特徵

[計算機視覺:演算法與應用]學習筆記:影象形成

1. 2D點可以利用一對值(x,y)來表示,也可以利用齊次座標來表示,那麼什麼是齊次座標?用齊次座標表示有什麼優勢? #二維點(x,y)的齊次座標表示為(hx,hy,h)。由此可以看出,一個向量的齊

【python下使用OpenCV實現計算機視覺讀書筆記2】圖像與字節的變換

ng- == color and pytho avi data- imwrite center import cv2 import numpy import os # Make an array of 120,000 ran

深入理解計算機作業系統學習筆記

前言 《深入理解計算機作業系統》這本書是作業系統領域內非常經典的書,只要在網上搜索作業系統的書籍,必然會有人推薦這一本書,這本書也被各路大牛所推薦。雖然之前在圖書館借過這本書,但是匆匆看了一遍,只是記住了皮毛,最近下決心買了本紙質版的書,準備重讀經典,順便寫下讀書的收穫與思考。 這本