日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

OpenCV入门之寻找图像的凸包(convex hull)

發布時間:2023/12/13 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 OpenCV入门之寻找图像的凸包(convex hull) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

??凸包(Convex Hull)是一個計算幾何(圖形學)中的概念,它的嚴格的數學定義為:在一個向量空間V中,對于給定集合X,所有包含X的凸集的交集S被稱為X的凸包。
??在圖像處理過程中,我們常常需要尋找圖像中包圍某個物體的凸包。凸包跟多邊形逼近很像,只不過它是包圍物體最外層的一個凸集,這個凸集是所有能包圍這個物體的凸集的交集。如下圖所示:

在上圖中,綠色線條所包圍的凸集即為白色圖形的凸包。
??在opencv中,通過函數convexHulll能很容易的得到一系列點的凸包,比如由點組成的輪廓,通過convexHull函數,我們就能得到輪廓的凸包。尋找圖像的凸包,能夠讓我們做一些有意思的事情,比如手勢識別等。
??下面筆者將會通過兩個簡單例子來展示如何用OpenCV來尋找圖像的凸包。

簡單例子1 幾何圖形

??首先,我們用以下的Python代碼來自己繪制一張簡單的多邊形的圖片(polygon.png),代碼如下:

import cv2
import numpy as np

# 新建512*512的空白圖片
img = np.zeros((512,512,3), np.uint8)
# 平面點集
pts = np.array([[200,250], [250,300], [300, 270], [270,200], [120, 240]], np.int32)
pts = pts.reshape((-1,1,2))
# 繪制填充的多邊形
cv2.fillPoly(img, [pts], (255,255,255))
# 保存圖片
cv2.imwrite('F://polygon.png', img)

繪制的圖片如下:

??接著我們需要尋找這個多邊形的凸包,利用OpenCV的convexHull函數,然后再將這個凸包繪制出來,得到直觀的展示結果。處理的Python代碼如下:

import cv2

# 讀取圖片并轉至灰度模式
imagepath = 'F://convex.png'
img = cv2.imread(imagepath, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 圖片輪廓
image, contours, hierarchy = cv2.findContours(thresh, 2, 1)
cnt = contours[0]
# 尋找凸包并繪制凸包(輪廓)
hull = cv2.convexHull(cnt)
print(hull)

length = len(hull)
for i in range(len(hull)):
    cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,255,0), 2)

# 顯示圖片
cv2.imshow('line', img)
cv2.waitKey()

輸出的結果如下:

[[[300 270]]

 [[299 271]]

 [[254 298]]

 [[250 300]]

 [[120 240]]

 [[122 239]]

 [[257 203]]

 [[269 200]]

 [[270 200]]

 [[273 206]]

 [[300 269]]]

這是凸包所在的輪廓的點集集合,有了它,我們就能繪制出凸包的輪廓了,如下:

簡單例子2 手勢圖片

??接下來,我們將介紹一張稍微難一點的圖片——手勢圖片(finger.jpg),如下所示:

我們將會來尋找這個手勢的凸包。基本的處理思路還是和之前的一致,只是要在二值化以及凸包點集集合的大小上做一些處理,取二值化的閾值為235,凸包點集中的點個數大于5,完整的Python代碼如下:

import cv2

# 讀取圖片并轉至灰度模式
imagepath = 'F://finger.jpg'
img = cv2.imread(imagepath, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二值化,取閾值為235
ret, thresh = cv2.threshold(gray, 235, 255, cv2.THRESH_BINARY)

# 尋找圖像中的輪廓
image, contours, hierarchy = cv2.findContours(thresh, 2, 1)

# 尋找物體的凸包并繪制凸包的輪廓
for cnt in contours:
    hull = cv2.convexHull(cnt)
    length = len(hull)
    # 如果凸包點集中的點個數大于5
    if length > 5:
        # 繪制圖像凸包的輪廓
        for i in range(length):
            cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,0,255), 2)

cv2.imshow('finger', img)
cv2.waitKey()

檢測到的凸包如下圖所示:

可以發現,一共檢測到2個凸包,一個是整個手勢外圍的凸包,正好包圍整個手,另一個是兩個手指形成的內部的圖形,類似于O的凸包,這符合我們的預期。

總結

??當然,我們在這里只是介紹了OpenCV檢測凸包的函數convexHull以及其應用,并沒有講到如何檢測凸包的算法。如有機會,筆者將會介紹該算法。歡迎大家交流,祝大家國慶快樂!

注意:本人現已開通微信公眾號: 輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~

總結

以上是生活随笔為你收集整理的OpenCV入门之寻找图像的凸包(convex hull)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。