一、概述
????????1、簡單介紹
????????OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,旨在為實時圖像處理提供強大的功能。它由Intel開發,現由開源社區維護。OpenCV 提供了跨平臺的解決方案,支持 Windows、Linux、macOS、iOS 和 Android 系統,適用于各種應用場景
????????2、OpenCV的主要特點:
????????????????圖像和視頻處理:OpenCV 提供了強大的圖像處理和視頻處理功能,包括圖像讀取、寫? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 入、顯示,圖像濾波、變換、邊緣檢測、輪廓識別等。
????????????????計算機視覺:包括人臉檢測、物體識別、圖像分類、特征匹配、跟蹤目標等高級應用。
????????????????機器學習:內置了一些機器學習算法,支持分類、回歸、聚類等任務。
????????????????GPU加速:支持基于CUDA的GPU加速,能夠在處理大量數據時顯著提高計算效率。
????????????????廣泛的應用場景:被廣泛應用于工業自動化、監控系統、醫療圖像處理、無人駕駛等領? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?域。
? ? ? ? 3、環境安裝
? ? ? ? ? ? ? ? 在要使用openCV的環境中輸入下面指令:
pip install opencv-python
? ? ? ? ? ? ? ? 但直接通過以上命令安裝對網速要求巨大,推薦使用下面的鏡像源安裝:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
二、使用前的基礎理論知識掌握
? ? ? ? 1、像素
????????????????像素是圖像的基本單元,每個像素存儲著圖像的顏色、亮度和其他特征。一系列像素? ? ? ? ? ? ? ? ?組合到一起就形成了完整的圖像
? ? ? ? 2、通道(RGB)
????????????????opencv中常用的是8位圖像,大多數彩色和灰度圖像使用8位表示每個通道的像素值,范? ? ? ? ? ? ? ?圍從0到255,其中0,代表最黑,1,表示最白。
????????????????日常生活中常見的圖像是RGB三原色圖。RGB圖上的每個點都是由紅(R)、綠? ? ? ? ? ? ? ? ? ? ? (G)、藍(B)三個顏色按照一定比例混合而成的,幾乎所有顏色都可以通過這三種顏色按? ? ? ? ? ? 照不同比例調配而成。在計算機中,RGB三種顏色被稱為RGB三通道,每個通道的取值都? ? ? ? ? ? ? 是0-255,根據這三個通道存儲的像素值,來對應不同的顏色。
? ? ? ? 3、圖像存儲
????????????????在OpenCV中,無論是讀取還是創建圖像,結果都是一個NumPy數組。
? ? ? ? ? ? ? ? ? ? ? ? a. 彩色圖像:三維數組
? ? ? ? ? ? ? ? ? ? ? ? b. 灰度圖像:二維數組
? ? ? ? ? ? ? ? 圖像本質上是像素值的二維或三維矩陣(彩色圖像)
? ? ? ? ? ? ? ? ? ? ? ? a. 形狀:圖像的尺寸由其高、寬和通道數決定。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (彩色圖像返回一個包含三個值的元組(h, w, c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 灰度圖返回一個包含兩個值的元組( h,w)因為灰度圖只有一個通道)
? ? ? ? ? ? ? ? ? ? ? ? b. 數據類型:圖像中的每個像素值的數據類型決定了可以存儲的最大值
? ? ? ? ? ? ? ? ? ? ? ? c. 像素表示:
????????????????????????????????單通道圖像(灰度圖像):每個像素由一個數值表示,代表該點的亮度。值? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????越低(接近0),顏色越暗;值越高(接近255),顏色越亮。
????????????????????????????????多通道圖像(彩色圖像): 在OpenCV中,默認情況下,彩色圖像是以BGR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????(藍-綠-紅)順序存儲
三、基礎操作
cv2.imshow(圖片名, 讀取的圖片):顯示圖片
(注意:在調用顯示圖像的API后,要調用cv2.waitKey(0)給圖像繪制留下時間,否則窗口會出現無響應情況,并且圖像無法顯示出來)
cv2.waitkey(n): 圖片顯示時長,n 的單位為毫秒,當 n = 0 時,圖片一直顯示
cv2.destroyAllWindows():?關閉所有顯示窗口,釋放資源
? ? ? ? 1、讀取圖片
? ? ? ? ? ? ? ? cv2.imread(path[,讀取方式])
img = cv2.imread("../cat/cat_3.jpg")
#將圖片轉化成灰度圖
img1 = cv2.imread("../cat/cat_3.jpg",cv2.IMREAD_GRAYSCALE)
(./:當前目錄;../:上級目錄,)
示例:
? ? ? ? 2、保存圖像
? ? ? ? ? ? ? ? cv2.imwrite(path, img)
cv2.imwrite('../data/f_cat_4.jpg',img)
(代碼解析:將 img 圖片保存成指定的data目錄下的 f_cat_4.jpg )
? ? ? ? 3、創建黑白圖像
? ? ? ? ? ? ? ? 3.1 全黑圖像:
? ? ? ? ? ? ? ? ? ? ? ??使用np.zeros()
創建全黑圖像
numpy.zeros((height,width,channels),dtype=np. uint8)
? ? ? ? ? ? ? ? 3.2 全白圖像:
np.full((h, w, c),fill_value,dtype = np.uint8)
? ? ? ? (fill_value == 255 時就是全白圖像)
????????拓展:也可以通過下面這種方法把全黑圖像轉換成全白圖像
black = np.zeros((360,480,3),dtype = np.uint8)
cv2.imshow('white',black)black[:,:,:] = 255
cv2.imshow('white1',black)black[:,:] = 255
cv2.imshow('white2',black)black[:] = 255
cv2.imshow('white3',black)
? ? ? ? 4、圖片裁切
? ? ? ? ? ? ? ?Opencv中, 圖像的裁切其實就是對圖像的數組形式進行切片,用于從圖像中提取一個? ? ? ? ? ? ? ? ? ?子區域(矩形區域)
(注意:先切高,后切寬)
img[y:y+h,x:x+w]的含義如下:x:子區域左上角的x坐標y:子區域左上角的y坐標w:子區域的寬度h:子區域的高度
????img[y:y+h,x:x+w]
提取的是從(x,y)
開始,高度為h
,寬度為w
的矩形區域?
? ? ? ? 5、圖像大小調整
? ? ? ? ? ? ? ? cv2.resize是Opencv庫中用于調整圖像大小的函數,在圖像處理中很常用,特別是在? ? ? ? ? ? ? ? ? ? ??要對圖像進行縮放以適應不同需求時
cv2.resize(img,dsize)
#img:輸入圖像,通常是二維或三位NumPy數組。
#dsize:輸出圖像的尺寸,是一個二元組`(w,h)`,
? ? ? ? 6、讀取視頻
? ? ? ? ? ? ? ? cap =?cv2.VideoCapture(path)
????????????????(path:?視頻流資源路徑,? 設置為 0 時代表從默認攝像頭捕獲視頻流 )
? ? ? ? ? ? ? ? ret,frame = cap.read()
? ? ? ? ? ? ? ? (返回值cap調用read()方法得到一個布爾值和一幀圖像,布爾值表示是否成功讀取到? ? ? ? ? ? ? ? ? ? ? ? ?幀,如果為False,可能是因為視頻結束或讀取失敗,如果為True,frame則是當前幀的? ? ? ? ? ? ? ? ? ?圖像數據 )
示例:(參考代碼)
四、圖像繪制
? ? ? ? 1、繪制直線
? ? ? ? ? ? ? ? cv2.line()
cv2.line(img,start,end,color,thickness)#img:要繪制直線的圖像#start、end:直線的起點和終點#color:直線的顏色(對于彩色圖像,使用 BGR 格式指定顏色)#thickness:線條寬度
示例:
? ? ? ? 2、繪制矩形?
? ? ? ? ? ? ? ? cv2.rectangle()
cv2.rectangle(img,leftupper,rightdown,color,thickness)#img:要繪制矩形的圖像#leftupper、rightdown:矩形的左上角和右下角坐標#color:線條的顏色#thickness:線條的寬度
?示例:
? ? ? ? ?3、繪制圓形
? ? ? ? ? ? ? ? cv2.circle()
cv2.circle(img,centerpoint,r,color,thickness)#img:要繪制圓形的圖片#centerpoint、r:圓心和半徑#color:線條顏色#tnickness:線條寬度,為-1時生成閉合圖案并填充顏色
示例: