最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

openCV入門學習基礎教程第一篇

 更新時間:2022年11月21日 09:34:15   作者:老師我作業(yè)忘帶了  
OpenCV是計算機視覺領域一個圖像和視頻處理庫,用于各種圖像和視頻分析,如面部識別和檢測,車牌閱讀,照片編輯,高級機器人視覺,光學字符識別等等,下面這篇文章主要給大家介紹了關于openCV入門學習基礎教程第一篇的相關資料,需要的朋友可以參考下

前言:計算機眼中的圖片 

  • 計算機中圖片由許多個像素點組成,如一個500x500的圖片,表示長寬各由500個像素點組成。
  • 計算機中一個像素點的值在0-255表示該點亮度  0暗(黑)-255亮(白) 
  • 一張彩圖通常是由RGB(red、green、blue)三個顏色通道所組成
  • 一個500x500的圖片那他們的 RGB 矩陣也各是500x500。

上圖我們將一個大的圖片分割成許多如20x20的小圖片,同理每個小圖片它們的RGB矩陣也各自是20x20。

注:opencv默認順序不是RBG 而是 BGR。

1. 圖片的讀取與顯示

1.1 圖片的讀取 

import cv2 
img = cv2.imread('./data/abv.jpg')

img = cv2.imread('./data/abv.jpg') 

比如我讀入這樣一張圖片,命名為img;

我們可以看到img是一個三維ndarray結構,內(nèi)部數(shù)據(jù)類型dtype=unit8:

fa66daf6f2e04378ad0a3e9fad429222.png

三維:(1080,1920,3)表示高度、寬度、顏色通道個數(shù)(cv彩圖BGR)ndarray結構:數(shù)據(jù)類型dtype=unit8, 0-255。

1.2 顯示的圖片

1.2.1 顯示原始圖片 

cv2.imshow('image',img) # 第一個參數(shù)表示窗口指定的名字 第二個為上方img
cv2.waitKey(5000) # 等待時間  如果是5000則在5s后圖片窗口自動關閉  0表示任意鍵關閉
cv2.destroyAllWindows() # 時間一到關閉窗口

 ps: 圖像的顯示也可以是多個窗口

  • cv2.imshow('image',img) 自己給將要彈出的窗口起個名  再加入變量img
  • cv2.waitKey(5000) 等待時間  如果是5000則在5s后圖片窗口自動關閉  0表示任意鍵關閉
  • cv2.destroyAllWindows() 時間一到關閉窗口

為方便下面使用,我們自己定義一個函數(shù)cv_show():

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

執(zhí)行代碼,彈出窗口,顯示圖片:

cv_show('winName',img)

1.2.2 灰度圖

在之前的基礎之上加入?yún)?shù):cv2.IMREAD_GRAYSCALE 

img2=cv2.imread('./data/abv.jpg',cv2.IMREAD_GRAYSCALE)  # cv2.IMREAD_COLOR

img2=cv2.imread('./data/abv.jpg',cv2.IMREAD_GRAYSCALE)  

  • cv2.IMREAD_GRAYSCALE  讀取為灰度圖,也可以寫0。
  • cv2.IMREAD_COLOR           讀取為彩圖

我們執(zhí)行:

cv_show('win2',img2) 

可以看到該圖片最終顯示結果為二維(1080,1920) :

ca9cba0adb754f20b82d6d042013260d.png

ps: img.size 輸出像素點的個數(shù),可以看到同一張圖片BGR彩圖是灰度圖的三倍。

95b3b5d31c7c4a31b22b22353bfe81dc.png

1.3 BGR轉換成灰度圖、RGB

當然我們也可以把已經(jīng)讀取進來的BGR彩圖轉換成灰度圖,或者轉換為RGB。

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
cv_show('win3',img2)

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

  • cv2.COLOR_BGR2RGB 將BGR格式轉換成RGB
  • cv2.COLOR_BGR2GRAY 將BGR格式轉換成灰度圖片

2. 保存圖片

cv2.imwrite('./data/grayPhoto.jpg',img2)

cv2.imwrite('./data/grayPhoto.jpg',img2)

此時我的data文件夾下就多了一張才處理好名為grayPhoto的灰度圖。

899d5d3076bb4e2ebbb5886343545a50.png

3. 視頻的讀取與顯示

視頻也是由圖像組成的,每一幀都可以當作是一個靜止的圖像,把圖像連在一起看著就像是一個視頻了。 我們打游戲時,也是追求一些更高的幀率。

vc = cv2.VideoCapture('./data/stu.mp4')

vc = cv2.VideoCapture('./data/stu.mp4')

# 檢查是否正確打開
if vc.isOpened():
    open,frame = vc.read()
else:
    open = Flase

vc.read()

  • 讀取視頻中的第一幀 ,再次執(zhí)行vc.read()的話讀取視頻第二幀
  • 返回值中:第一個:布爾類型,能讀進來就是True   第二個像是上面的img,這一幀圖片的ndarray矩陣

循環(huán)圖片播放視頻:

while open:
    ret,frame = vc.read()
    if frame is None:
        break
    if ret == True:
        # 原本frame是(h,w,3)的BGR圖片矩陣 經(jīng)下方加入?yún)?shù)轉換成黑白gray
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 
        cv2.imshow('result',gray)
        # cv2.waitKey(num) 該圖片顯示時間/速度 自己可以找一個合適的值
        # 27指退出鍵ESC 退出窗口  當然也可以是 =='q'等
        if cv2.waitKey(20)&0xFF == 27: 
            break
vc.release()
cv2.destroyAllWindows()

注:視頻放完 ret, frame = vc.read()返回False和None 再次進行循環(huán)無法播放視頻,需要重新讀取。

if cv2.waitKey(20)&0xFF == 27:

  • 不是新知識點了,表示每張圖片等20毫秒,如果按ESC鍵直接退出。

4. 截取圖像部分

我們上面介紹,img是一個ndarray矩陣,因此對其進行切片操作:

pho = img[100:800,200:800]  # 進行切片 高100到800 寬200到800
cv_show('win2',pho)

pho = img[100:800,200:800]

5. 顏色通道提取

b,g,r = cv2.split(img)
# b.shape g.shape r.shape 都為 (1080, 1920)

執(zhí)行

cv_show('win3',g) # 或者填 b、r

結果就是單通道圖。

如果我們想顯示單一顏色,如紅色:

cur_img = img.copy()
cur_img[:,:,0] = 0 # B不要了 設置為0
cur_img[:,:,1] = 0 # G不要了 設置為0
#cur_img[:,:,2] = 0 # R不要了 設置為0
cv_show('winR',cur_img)

6. 邊界填充

這個一般用于卷積,在圖像周圍填充一些像素。

我們以這個圖片為例:

img = cv2.imread('./data/gd01.jpg')
# img.shape 為 (300, 400, 3)
cv_show('win1',img)

f4320c38f6d647c684c59065fdaa50c2.jpeg

在圖片的上下左右填充50個像素,介紹5種方法: 

top_size,bottom_size,left_size,right_size=(50,50,50,50)
 
# 不同的填充方法 最后參數(shù)改個type值就行
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
# 注matplotlib默認R G B本例只介紹邊界填充
plt.show()

496a683aaecc451faf5818c736c4d6d8.png

  • cv2.BORDER_REPLICATE
    • 復制最邊緣的像素
  • cv2.BORDER_REFLECT
    • 反射法對感興趣的圖像中的像素在兩邊進行復制 如fedcba|abcdefgh|hgfedcb 其中abcdefgh是圖像"|"外的是填充內(nèi)容
  • cv2.BORDER_REFLECT_101
    • 反射法,也就是以最邊緣的像素為軸,對稱,gfedcb|abcdefgh|gfedcba 上面是ba|ab 這個是bab。
  • cv2.BORDER_WRAP
    • 外包裝法 如:cdefgh|abcdefgh|abcdefg。
  • cv2.BORDER_CONSTANT
    • 常量法,常數(shù)值value填充。

7. 數(shù)值計算

78fc17d7f1a44630a2c7855a1001adac.png

由于是uint8類型最大255 超過相當于結果為 num%256了 

我們使用以下方法保留最大值:

cv2.add(img,img2)

cv2.add(img,img2)

a3903457723941c786a7d8b1ca915878.png

8. 圖像融合

效果如下:

我們導入寬高相同的2張圖片:

img = cv2.imread('./data/gd04.jpg')
img2 = cv2.imread('./data/gd05.jpg')
img3 = cv2.imread('./data/gd06.jpg')
print(img.shape,img2.shape,img3.shape) # (281, 600, 3) (281, 600, 3) (337, 600, 3)

如果大小不同 需要手動設置成一樣的

img3 = cv2.resize(img3,(600,281))
# img3.shape (281, 600, 3)

img3 = cv2.resize(img3,(600,281))

ps: cv2.resize()另一種操作

img4 = cv2.resize(img3,(0,0),fx=2,fy=1)

我們執(zhí)行:

res = cv2.addWeighted(img,0.6,img2,0.4,0)
plt.imshow(res)

res = cv2.addWeighted(img,0.6,img2,0.4,0)

R = ax1 + bx2 + c  a、b為權重 c為偏置 這里意為在原亮度上變化多少

9. 知識點總結*

讀取圖片:

import cv2 
img = cv2.imread('./data/abv.jpg')
img2 = cv2.imread('./data/abv.jpg',cv2.IMREAD_GRAYSCALE) 
img3 = cv2.imread('./data/abv.jpg',cv2.IMREAD_COLOR) 

顯示圖片:

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

BGR轉換成灰度圖、RGB:

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
img3 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 

保存圖片:

cv2.imwrite('./data/grayPhoto.jpg',img2)

視頻的讀取與顯示:

vc = cv2.VideoCapture('./data/stu.mp4')
 
# 檢查是否正確打開
if vc.isOpened():
    open,frame = vc.read()
else:
    open = Flase
 
while open:
    ret,frame = vc.read()
    if frame is None:
        break
    if ret == True:
        # 原本frame是(h,w,3)的BGR圖片矩陣 經(jīng)下方加入?yún)?shù)轉換成黑白gray
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 
        cv2.imshow('result',gray)
        # cv2.waitKey(num) 該圖片顯示時間/速度 自己可以找一個合適的值
        # 27指退出鍵ESC 退出窗口  當然也可以是 =='q'等
        if cv2.waitKey(20)&0xFF == 27: 
            break
vc.release()
cv2.destroyAllWindows()

截取圖片部分:

pho = img[100:800,200:800]  # 進行切片 高100到800 寬200到800

顏色通道提?。?/p>

b,g,r = cv2.split(img)
cur_img = img.copy()
cur_img[:,:,0] = 0 # B不要了 設置為0
cur_img[:,:,1] = 0 # G不要了 設置為0
#cur_img[:,:,2] = 0 # R不要了 設置為0
cv_show('winR',cur_img)

邊界填充:

top_size,bottom_size,left_size,right_size=(50,50,50,50)
 
# 不同的填充方法 最后參數(shù)改個type值就行
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)

數(shù)值計算:

cv2.add(img,img2)

圖像融合:

img3 = cv2.resize(img3,(600,281))
 
res = cv2.addWeighted(img,0.6,img2,0.4,0)

總結

到此這篇關于openCV入門學習基礎教程的文章就介紹到這了,更多相關openCV第一篇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)生成Word、docx文件的方法分析

    python實現(xiàn)生成Word、docx文件的方法分析

    這篇文章主要介紹了python實現(xiàn)生成Word、docx文件的方法,結合實例形式分析了Python使用docx模塊操作word文件與docx文件的相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-08-08
  • windows下安裝python的C擴展編譯環(huán)境(解決Unable to find vcvarsall.bat)

    windows下安裝python的C擴展編譯環(huán)境(解決Unable to find vcvarsall.bat)

    這篇文章主要介紹了windows下安裝python的C擴展編譯環(huán)境(解決Unable to find vcvarsall.bat),需要的朋友可以參考下
    2018-02-02
  • django富文本編輯器的實現(xiàn)示例

    django富文本編輯器的實現(xiàn)示例

    這篇文章主要介紹了django富文本編輯器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Python中文件讀取與保存代碼示例

    Python中文件讀取與保存代碼示例

    Python中保存文件是一項非?;镜娜蝿?它允許我們將程序輸出保存到磁盤上,以便以后使用或與他人共享,這篇文章主要給大家介紹了關于Python中文件讀取與保存的相關資料,需要的朋友可以參考下
    2024-04-04
  • python操作MySQL數(shù)據(jù)庫具體方法

    python操作MySQL數(shù)據(jù)庫具體方法

    堅持每天學一點,每天積累一點點,作為自己每天的業(yè)余收獲,這個文章是我在吃飯的期間寫的,利用自己零散的時間學了一下python操作MYSQL,所以整理一下。我采用的是MySQLdb操作的MYSQL數(shù)據(jù)庫。先來一個簡單的例子吧
    2013-10-10
  • Python中計算三角函數(shù)之cos()方法的使用簡介

    Python中計算三角函數(shù)之cos()方法的使用簡介

    這篇文章主要介紹了Python中計算三角函數(shù)之cos()方法的使用簡介,是Python入門的基礎知識,需要的朋友可以參考下
    2015-05-05
  • PyTorch?Dataset與DataLoader使用超詳細講解

    PyTorch?Dataset與DataLoader使用超詳細講解

    用于處理數(shù)據(jù)樣本的代碼可能會變得凌亂且難以維護;理想情況下,我們希望數(shù)據(jù)集代碼與模型訓練代碼解耦,以獲得更好的可讀性和模塊化。PyTorch提供的torch.utils.data.DataLoader和torch.utils.data.Dataset允許你使用預下載的數(shù)據(jù)集或自己制作的數(shù)據(jù)
    2022-10-10
  • python3 使用函數(shù)求兩個數(shù)的和與差

    python3 使用函數(shù)求兩個數(shù)的和與差

    這篇文章主要介紹了python3 使用函數(shù)求兩個數(shù)的和與差,具有很好的參考價值,希望對大家有所幫助。
    2021-05-05
  • python數(shù)據(jù)分析apply(),map(),applymap()用法

    python數(shù)據(jù)分析apply(),map(),applymap()用法

    這篇文章主要介紹了python數(shù)據(jù)分析apply(),map(),applymap()用法,可以方便地實現(xiàn)對批量數(shù)據(jù)的自定義操作。用法歸納如下,需要的朋友可以參考一下
    2022-03-03
  • Python: 傳遞列表副本方式

    Python: 傳遞列表副本方式

    今天小編就為大家分享一篇Python: 傳遞列表副本方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

陇南市| 商丘市| 绥德县| 柳河县| 建昌县| 四川省| 平邑县| 永修县| 商城县| 阿巴嘎旗| 天峻县| 四川省| 永清县| 沾益县| 柳河县| 凤台县| 东城区| 碌曲县| 分宜县| 略阳县| 沅陵县| 龙胜| 迭部县| 青龙| 日照市| 乌兰察布市| 通城县| 孝义市| 尉氏县| 洱源县| 静海县| 隆昌县| 喜德县| 巫溪县| 饶平县| 嘉黎县| 绵阳市| 盐源县| 清水河县| 保亭| 治县。|