光速入門python的OpenCV

前言

歡迎來到我的博客

個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客

?本文整理python的OpenCV模塊的關鍵知識點

爭取用最短的時間入門OpenCV

并且做到筆記功能直接復制使用

OpenCV簡介

不浪費時間的介紹:

就是類似于ps操作圖片。

至于為什么不直接用ps,因為只有程序能完成ps的操作,這樣才能完全自動化2小時不間斷的執行一些程序,總不能執行到一定地方要等你人為的在ps中做好圖片再來執行程序吧。

功能點羅列:

畫圖,圖片高斯模糊,腐蝕膨脹等處理,開啟攝像頭。

最基本的使用

導入模塊:import cv2
方法作用
cv2.getVersionString()返回OpenCV的版本
cv2.imread(文件地址,圖片灰彩類型)

讀取文件,用于實例化對象

灰彩類型:(可以不寫)

cv2.IMREAD_COLOR讀入彩色圖像cv2.IMREAD_GRAYSCALE讀入灰色圖像

對象.shape返回圖片的大小(像素)
cv2.imshow(窗口名,圖片對象)返回個窗口用于展示這個圖片
cv2.waitKey(自動關閉時間)

窗口不自動關閉,知道按下任意鍵或者到規定時間(時間為微秒)

返回他按得鍵的代號數字

到時間返回-1

cv2.imwrite(保存路徑和文件名,保存的圖片)保存編輯的圖片

注意:

這個庫不支持任何中文!!!!!

不管是圖片文件命名還是窗口等

一律別用中文!!!!!!!

(至少我的版本不支持任何中文)

案例演示:

import cv2#導入庫
print(cv2.getVersionString())#返回版本號
image=cv2.imread("konglong.jpg")#導入圖片,實例化
print(image.shape)#返回圖片的大小和通道cv2.imshow("阿薩德",image)#展示圖片
cv2.waitKey(1000)#設置暫停
cv2.imwrite("okok.jpg",image)#保存圖片

結果:

打印信息

保存okok圖片

展示圖片(代碼中用中文做窗口所以會亂碼)

?視頻的打開方式

我們視頻有兩種:攝像頭,視頻文件

用到的函數:

讀取視頻或攝像頭:cv2.VideoCapture(視頻或者攝像頭的指針)
返回視頻讀取的照片:cap.read()

開啟攝像頭

思路:原理就是對這攝像頭一遍遍截圖。然后我們不斷的刷新顯示的圖片。

代碼如下:

import cv2#導入庫
cap=cv2.VideoCapture(0)#讀取攝像頭
while True:#循環valu,video=cap.read()#讀取攝像頭內容show=cv2.imshow("video",video)#展示攝像頭key=cv2.waitKey(1)#設置等待0.001秒刷新一次print(key)if key!=-1:#如果不是到時間刷新的視頻就退出視頻break

結果如下:

?按下別的鍵就關閉了。(字母有時候不行,數字或者特殊按鍵相對靠譜點)

視頻打開方式

代碼:

import cv2#導入庫
cap=cv2.VideoCapture("bingdu.mp4")
while True:valu,video=cap.read()show=cv2.imshow("video",video)key=cv2.waitKey(1)print(key)if key!=-1:break

基本一樣不截圖了

灰度圖獲取與處理

介紹:OpenCV儲存圖片實際上是儲存三原色的三張圖片,最后整合在一起。采用bgr圖像。

灰度加權平均:

cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

展示隔色彩圖像:

cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])

用法演示:(圖片太大不展示效果了)

import cv2
image=cv2.imread("konglong.jpg")
cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
cv2.waitKey()

裁剪圖像

crop=image[y軸開始裁剪位置:結束位置,x軸開始裁剪位置:結束位置]

水平為x,垂直為y

案例演示:

import cv2
image=cv2.imread("konglong.jpg")
print(image.shape)
y,h,x,w=100,300,100,600
crop=image[y:h,x:w]
cv2.imshow("crop",crop)
cv2.waitKey()

圖形繪制

可用于標記識別的物品

(注意,所有的粗細參數輸入負數后就是填充圖像)

繪制直線

cv2.line(圖片, 起點坐標, 終點坐標, 顏色, 粗細)

案例演示

import cv2
image=cv2.imread("okok.jpg")
cv2.line(image,(0,0),(700,600),(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

效果演示:

繪制方形

cv2.rectangle(圖片, 起點坐標, 終點坐標, 顏色, 粗細)

案例演示

import cv2
image=cv2.imread("okok.jpg")
cv2.rectangle(image,(309,310),(344,352),(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

繪制圓形

cv2.circle(image,原點坐標,半徑,顏色,粗細)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.circle(image,(329,329),30,(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

?橢圓繪制

cv2.ellipse(圖片, 中心點坐標, 橫縱軸長度(元組), 旋轉角度, 起始角度, 結束角度, 顏色, 粗細)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.ellipse(image, (256, 256), (100, 50), 60, 0, 360, (0, 255, 0), -1)
cv2.imshow("image",image)
cv2.waitKey()

繪制文字

cv2.putText(圖片, 文字, 位置, 字體, 文字大小, 顏色, 粗細)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.putText(image, "how cool am i!", (250, 350), cv2.FONT_HERSHEY_SIMPLEX, 2, (65,54,87), 2)
cv2.imshow("image",image)
cv2.waitKey()

噪點處理

噪點描述:拍攝時信號傳輸收到干擾產生的雜色,如下:

噪點處理,其實就是讓他變模糊,模糊之后邊界就會不明顯。但是也會影響一定的畫面。

所以一般情況下,是對圖像的局部噪點嚴重的區域進行區域內的噪點處理。

注意下面的核必須是奇數。

高斯模糊

cv2.GaussianBlur(圖像,高斯核,sigmaX,sigmaY,邊界樣式)
x與y差越大越模糊,0的話就是自行計算
實際上一般可以用下面形式進行使用
cv2.GaussianBlur(image,(5,5),0)

中值濾過(像素排序取中值平滑處理)

cv2.medianBlur(圖片,核)

案例演示

import cv2
image=cv2.imread("zaodian.jpeg")
cv2.imshow("image",image)
gauss=cv2.GaussianBlur(image,(5,5),0,11)
cv2.imshow("gauss",gauss)
median=cv2.medianBlur(image,5)
cv2.imshow("median",median)
cv2.waitKey()

效果演示

圖片特征提取

(但是OpenCV提取圖像特征的水平有限,如果需要特別的精準可以嘗試別的庫)

提取圖片的特征,比如說轉角,邊緣,紋理啥的。

提取思路:先把圖像給轉化為灰度圖,然后在灰度圖中匹配轉角這類的特征。

函數:

cv2.cvtColor(圖片,cv2.COLOR_BGR2GRAY) #灰度處理
cv2.goodFeaturesToTrack(圖片,最大特征數,點的質量,特征最小的距離)
.ravel()#點的坐標

案例演示

import cv2
image=cv2.imread("okok.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
corners=cv2.goodFeaturesToTrack(gray,500,0.1,10)
for corner in corners:x,y=corner.ravel()cv2.circle(image,(int(x),int(y)),2,(255,0,255),-1)
cv2.imshow("corners",image)
cv2.waitKey()

其實這些特征提取也不是特別的精準,看圖中的特征點也能看出來,這些特征點也不足以準確的識別這個畫面。

圖片匹配

原理:

也是把指定的圖片轉化為灰度圖,然后找特征點,之后在指定的圖片中匹配有沒有相似的特征點。

缺點:

對圖片的大小敏感。也就是說我們給的圖片距離鏡頭20m,但是在指定的圖片中,這個圖片在鏡頭50m的地方,就會因為大小不同而匹配不到。

解決思路:

可以改變圖像的大小進行多次匹配,或者減少匹配的精度要求(誤判多)。

(用到了numpy模塊)

函數

灰度處理:cv2.cvtColor(圖片,cv2.COLOR_BGR2GRAY)
匹配圖像:cv2.matchTemplate(gray_video, target, cv2.TM_CCOEFF_NORMED)
獲取坐標:numpy.where(match >= 匹配相似度)

案例演示

(我寫的這個識別度不是很高,不過能識別基本的功能,有點人工智障)

調用攝像頭實時識別書本上的java。

代碼案例

import cv2
import numpy as np
image=cv2.imread("java.jpg")
video=cv2.VideoCapture(0)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
x1,y1=617,608
x2,y2=967,734
target=gray[y1:y2,x1:x2]
cv2.imshow("okk",target)
h,w=target.shape[0:2]
print("{},{}".format(h,w))
a=1
while True:#循環valu,video1=video.read()#讀取攝像頭內容gray_video=cv2.cvtColor(video1,cv2.COLOR_BGR2GRAY)if a==1:a=2cv2.imshow("okkk",gray_video)match = cv2.matchTemplate(gray_video, target, cv2.TM_CCOEFF_NORMED)place = np.where(match >= 0.9)print(place)for p in zip(*place[::-1]):x_1, y_1 = p[0], p[1]x_2, y_2 = x_1 + w, y_1 + hprint(x_1,x_2)cv2.rectangle(video1,(x_1, y_2),(x_2, y_2),(156, 124, 21), 1)show=cv2.imshow("video",video1)#展示攝像頭key=cv2.waitKey(1)#設置等待0.001秒刷新一次if key!=-1:#如果不是到時間刷新的視頻就退出視頻break

效果演示

嗯人工智障,識別條件特別苛刻。

不過也算是能夠完成實時識別的功能了。

圖像梯度算法

簡介一下圖像梯度:

圖像梯度就像地理地圖的等高線一樣。

給我們分辨一個區域的圖像像素變化的強度,如果他變化強度比較大,那么他大概率是圖形的邊緣。可以利用圖像的梯度來分辨圖像中的不同的物體。

拉普拉斯算子

作用:利用梯度的方法檢測圖像邊緣,輪廓以及紋理。

函數:

常用寫法:cv2.Laplacian(圖片,cv2.CV_64F)
完整寫法:cv2.Laplacian(image, dest, ddepth, ksize, scale, delta, borderType)
image是輸入圖像,dest是輸出圖像,ddepth是輸出圖像的深度,ksize是卷積核的大小,scale是拉普拉斯算子的系數

案例演示:

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
laplacian=cv2.Laplacian(gray,cv2.CV_64F)
cv2.imshow("yuantu",image)
cv2.imshow("suanfa",laplacian)
cv2.waitKey()

效果演示:

?canny算子

函數:

cv2.Canny(gray,邊緣1,邊緣2)

原理:

像素變化強度大于邊緣2被判定為是邊界,小于邊界1被判定為不是邊界。在兩者之間的區域根據已經判斷的區域進行判斷。

源碼如下:

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
canny=cv2.Canny(gray,100,200)
canny2=cv2.Canny(gray,50,100)
cv2.imshow("yuantu",image)
cv2.imshow("canny",canny)
cv2.imshow("canny2",canny2)
cv2.waitKey()

效果演示:

好處就是自己能規定他判斷的嚴格程度。

閾值算法(二值化)

普通算法

描述:眾所周知,我們世界的顏色并不是絕對的黑白,我們由黑白之間可以配出很多種灰色。

我們就可以用這個原理來把這些灰色絕對化。滿足某個值的就變成黑色,不滿足的就是白色。

這樣就可以識別一些黑暗環境中的文字或者物品。

(但也別指望太準,要是拿個你自己都分辨不出來的圖片,用這個也不容易。。。)

函數

cv2.threshold(圖片,閾值,最大灰度,處理方法)
本案例用的函數:cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
(因為這張照片環境明堂堂的。。。)

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
cv2.waitKey()

效果演示

分區二值化算法

OpenCV有內置的分區二值化算法,自動計算這個小區域的閾值,并設定合適的閾值。

函數

函數:(案例)
cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)該函數有以下參數:src: 要二值化的原始圖像。maxval: 閾值的最大值。adaptiveMethod: 用于計算閾值的方法。有兩個選項可供選擇:cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C。推薦使用默認的cv2.ADAPTIVE_THRESH_GAUSSIAN_C。thresholdType: 閾值類型。可以是cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV。推薦使用默認的cv2.THRESH_BINARY。blockSize: 每個局部區域的大小,用來計算局部閾值。C: 從平均值或加權平均值中減去的常數。該參數在計算局部閾值時起到調整閾值的作用。

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
binary_adaptive=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)
cv2.imshow("binary",binary_adaptive)
cv2.waitKey()

結果演示

可以看到,明顯的比自己寫的那個好用。

大金算法

算法原理:找兩個最大的值,然后取兩個值的中心。讓黑白差異最大化。

函數

cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

好處

完全不用咱們自己設置閾值,他自己就可以設置的明明白白的。

但是也有缺點,不如自己設置的完美,有時候可能不是很好用。

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret1,binary_otsu=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("binary",binary_otsu)
cv2.waitKey()

效果演示

腐蝕與膨脹

腐蝕:就是給圖像變瘦一點(減少白色)

膨脹:相反,給圖像變胖一點(增加白色)

作用:可以處理圖像邊緣,放大或者縮小圖像的細節。

函數

他們都需要創建一個核

np.ones((5, 5), np.uint8)

膨脹與腐蝕

cv2.erode(圖像, kernel)  # 腐蝕
cv2.dilate(圖像, kernel)  # 膨脹

案例演示:

import cv2
import numpy as np
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret1,binary_otsu=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(binary_otsu, kernel)  # 腐蝕
dilate = cv2.dilate(binary_otsu, kernel)  # 膨脹
cv2.imshow("binary",binary_otsu)
cv2.imshow("er",erosion)
cv2.imshow("di",dilate)
cv2.waitKey()

效果演示:

腐蝕

膨脹

?這里看到,明明是腐蝕但是感覺像是做出膨脹的效果,這是因為這個是腐蝕白色。所以對于黑色來說是膨脹了。

總結

OK,這些就是OpenCV的基礎了。

他還有很多深入的算法,需要自己挖掘。

掌握了這些就能實現一些基本的功能了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15724.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【找出滿足差值條件的下標 I】python

目錄 暴力題解 優化:滑動窗口維護大小值 暴力題解 class Solution:def findIndices(self, nums: List[int], indexDifference: int, valueDifference: int) -> List[int]:nlen(nums)for i in range(n):for j in range(n-1,-1,-1):if abs(i-j)>indexDiffere…

海康威視NVR通過ehome協議接入視頻監控平臺,視頻瀏覽顯示3011超時錯誤的問題解決,即:The request timeout! 【3011】

目錄 一、問題描述 二、問題分析 2.1 初步分析 2.2 查看日志 2.3 問題驗證 1、查看防火墻 2、查看安全組 3、問題原因 三、問題解決 3.1 防火墻開放相關端口 3.2 安全組增加規則 3.3 測試 1、TCP端口能夠聯通的情況 2、TCP端口不能夠聯通的情況 四、驗證 五、云…

「51媒體」如何與媒體建立良好關系?

傳媒如春雨,潤物細無聲,大家好,我是51媒體網胡老師。 與媒體建立良好關系對于企業或個人來說都是一項重要的公關活動。 了解媒體:研究媒體和記者的興趣,提供相關且有價值的信息。 建立聯系:通過專業的方式…

牛客NC324 下一個更大的數(三)【中等 雙指針 Java/Go/PHP/C++】參考lintcode 52 · 下一個排列

題目 題目鏈接: https://www.nowcoder.com/practice/475da0d4e37a481bacf9a09b5a059199 思路 第一步:獲取數字上每一個數,組成數組arr 第二步:利用“下一個排列” 問題解題方法來繼續作答,步驟:利用lintc…

C++進階之路:何為拷貝構造函數,深入理解淺拷貝與深拷貝(類與對象_中篇)

?? 歡迎大家來訪Srlua的博文(づ ̄3 ̄)づ╭?~?? 🌟🌟 歡迎各位親愛的讀者,感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua小謝,在這里我會分享我的知識和經驗。&am…

PostgreSQL基礎(三):PostgreSQL的基礎操作

文章目錄 PostgreSQL的基礎操作 一、用戶操作 二、權限操作 三、操作任務

DRM驅動(五)之drm_atomic_state

上節講到《DRM驅動(四)之ADD_FB》調用drmModeAddFB創建drm_framebuffer。然后通過 drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map); vaddr mmap(0, create.size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, map.offset); 將物理地址map到用戶空間后…

Python中list遍歷的幾種方式之沒有好與不好,只有合適不合適

Python中list遍歷的幾種方式 引言 Python是一種動態、解釋型的高級編程語言,以其簡潔、易讀的語法而廣受歡迎。在Python中,list是一種非常重要的數據結構,它允許存儲一系列的元素,這些元素可以是任何類型。遍歷list是處理數據的…

nginx的Connection refused

問題描述 nginx的錯誤日志中突然出現大量的的Connection refused問題,日志如下: 2020/03/19 09:52:53 [error] 20117#20117: *7403411764 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server:…

解決CLion調試時無法顯示變量值的問題

1 問題描述 使用CLion的時候,調試時無法顯示變量的值,例如: 圖來自StackOverflow。 2 解決辦法 可以嘗試切換調試器解決,在Linux下,CLion支持GDB和LLDB,如果GDB不行,可以切換到LLDB。 切換方…

醫院信息化IT監控一體化運維實踐

作者: 曉風 在醫療信息化日益發展的今天,醫院數據中心的運維工作顯得尤為重要。為了確保醫療系統的穩定運行,保障患者數據的安全與完整,我院在信息化IT監控一體化運維方面進行了深入的探索和實踐。 一、背景與挑戰 我院的機房設備規模已有50…

主動歸檔存儲的策略研討

在媒體與娛樂(M&E)行業中,主動存檔策略對于應對內容的持續需求增長、控制存儲成本膨脹以及實現檔案內容的貨幣化至關重要。以下是對此策略的深入分析: ### 持續的內容需求帶來的挑戰 M&E企業面臨著巨大的挑戰&#xff1…

【Spring】SSM整合_入門代碼實現

1. Maven依賴 在pom.xml中添加SSM框架的依賴 <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.x</version> </dependency>…

軟件杯 題目: 基于深度學習的疲勞駕駛檢測 深度學習

文章目錄 0 前言1 課題背景2 實現目標3 當前市面上疲勞駕駛檢測的方法4 相關數據集5 基于頭部姿態的駕駛疲勞檢測5.1 如何確定疲勞狀態5.2 算法步驟5.3 打瞌睡判斷 6 基于CNN與SVM的疲勞檢測方法6.1 網絡結構6.2 疲勞圖像分類訓練6.3 訓練結果 7 最后 0 前言 &#x1f525; 優…

為什么單片機不能直接驅動繼電器和電磁閥

文章是瑞生網轉載&#xff0c;PDF格式文章下載&#xff1a; 為什么單片機不能直接驅動繼電器和電磁閥.pdf: https://url83.ctfile.com/f/45573183-1247189072-10b6d1?p7526 (訪問密碼: 7526)

java-數組內存分配

在 Java 中&#xff0c;數組是一種基本數據結構&#xff0c;用于存儲一系列相同類型的數據。在內存中&#xff0c;數組分配是一塊連續的內存空間&#xff0c;用于存儲數組中的所有元素。本篇文章將詳細解釋 Java 中數組的內存分配&#xff0c;包括數組的聲明、創建、內存模型以…

memcpy的使?和模擬實現

目錄 一&#xff1a;memcpy的使? memcpy的使?的代碼 二&#xff1a;memcpy函數的模擬實現: memcpy和strcpy的區別 用途&#xff1a; 安全性&#xff1a; 數據類型&#xff1a; 性能&#xff1a; 在字符串中的用法示例&#xff1a; memcpy: strcpy 一&#xff1a;…

Ajax面試題精選及參考答案(3萬字長文)

目錄 什么是Ajax,它的核心原理是什么? Ajax應用程序的優勢有哪些? Ajax最大的特點是什么?

Science 基于尖峰時序編碼的模擬神經觸覺系統,可實現動態對象分類

快速處理和有效利用手與物體交互過程中產生的動態觸覺信號&#xff08;例如觸摸和抓握&#xff09;對于觸覺探索和靈巧的物體操作至關重要。將電子皮膚&#xff08;e-skins&#xff09;推進到模仿自然觸覺的水平&#xff0c;是恢復截肢者和癱瘓患者喪失的功能的可行解決方案&am…

實現地圖上展示坐標時,不要全部展示、只展示幾個距離相對較大marker點位,隨著地圖放大再全部展示出來。

比例尺級別地面分辨率 &#xff08;米/像素&#xff09;比例尺0156543.031&#xff1a;591658700.82178271.5151&#xff1a;295829350.4239135.75751&#xff1a;147914675.2319567.878751&#xff1a;73957337.649783.9393751&#xff1a;36978668.854891.9696881&#xff1a…