做網(wǎng)站軟件j短視頻營(yíng)銷成功的案例
獲取凸包,可以參考我的這篇文章: 凸包(Convex Hull)代碼實(shí)現(xiàn)案例
獲取了凸包之后,可以干什么呢?
凸缺陷凸包與輪廓之間的部分稱為凸缺陷。凸缺陷可用來處理手勢(shì)識(shí)別等問題。
通常情況下,使用如下四個(gè)特征值來表示凸缺陷:
● 起點(diǎn):該特征值用于說明當(dāng)前凸缺陷的起點(diǎn)位置。需要注意的是,起點(diǎn)值用輪廓索引表示。也就是說,起點(diǎn)一定是輪廓中的一個(gè)點(diǎn),并且用其在輪廓中的序號(hào)來表示。例如,點(diǎn)A是凸缺陷1的起點(diǎn)。
● 終點(diǎn):該特征值用于說明當(dāng)前凸缺陷的終點(diǎn)位置。該值也是使用輪廓索引表示的。例如,圖8-4中的點(diǎn)B是凸缺陷1的終點(diǎn)。
● 輪廓上距離凸包最遠(yuǎn)的點(diǎn)。例如,點(diǎn)C是凸缺陷1中的輪廓上距離凸包最遠(yuǎn)的點(diǎn)。
● 最遠(yuǎn)點(diǎn)到凸包的近似距離。例如,距離D是凸缺陷1中的最遠(yuǎn)點(diǎn)到凸包的近似距離。
OpenCV提供了函數(shù)cconvexityDefects()用來獲取凸缺陷,其語法格式如下:
CONVEXITYDEFECTS()是OpenCV庫中的一個(gè)函數(shù),主要用于計(jì)算圖像中凸缺陷的信息。它可以通過輸入的輪廓點(diǎn)信息計(jì)算出凸缺陷的數(shù)量、位置和深度等信息,可以用于手勢(shì)識(shí)別、目標(biāo)檢測(cè)等應(yīng)用場(chǎng)景。在C++中使用該函數(shù)時(shí),需要包含OpenCV頭文件,并按照函數(shù)參數(shù)要求輸入輪廓點(diǎn)信息和凸包點(diǎn)信息等參數(shù),然后通過輸出參數(shù)獲取凸缺陷信息。
void cv::convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects);
函數(shù)參數(shù)說明如下:
- contour:輸入的輪廓點(diǎn)信息,可以通過cv::findContours()函數(shù)獲取。
- convexhull:輸入的凸包點(diǎn)信息,可以通過cv::convexHull()函數(shù)獲取。
- convexityDefects:輸出的凸缺陷信息,是一個(gè)N行4列的矩陣,每行包含4個(gè)元素,分別是凸缺陷起點(diǎn)索引、終點(diǎn)索引、最遠(yuǎn)點(diǎn)索引和距離
使用CONVEXITYDEFECTS()函數(shù)的步驟如下:
-
- 讀取圖像并轉(zhuǎn)換為灰度圖像。
Mat src = imread("image.jpg");
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
-
- 對(duì)灰度圖像進(jìn)行二值化處理。
Mat binary;threshold(gray, binary, 100, 255, THRESH_BINARY);
- 3.獲取圖像中的輪廓信息。
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
- 4.對(duì)每個(gè)輪廓計(jì)算凸包點(diǎn)信息。
vector<vector<int>> hull(contours.size());
for (int i = 0; i < contours.size(); i++){ convexHull(contours[i], hull[i], false);}
- 5.對(duì)每個(gè)輪廓計(jì)算凸缺陷信息。
vector<vector<Vec4i>> defects(contours.size());for (int i = 0; i < contours.size(); i++) { if (hull[i].size() > 3) { convexityDefects(contours[i], hull[i], defects[i]); }}
- 6.遍歷所有輪廓的凸缺陷信息,并繪制凸缺陷。
for (int i = 0; i < contours.size(); i++) { for (int j = 0; j < defects[i].size(); j++) { Vec4i& v = defects[i][j]; float depth = v[3] / 256.0; if (depth > 10) { int startidx = v[0]; Point start(contours[i][startidx]); int endidx = v[1]; Point end(contours[i][endidx]); int faridx = v[2]; Point far(contours[i][faridx]); line(src, start, end, Scalar(0, 0, 255), 2); line(src, start, far, Scalar(0, 255, 0), 2); line(src, end, far, Scalar(0, 255, 0), 2); circle(src, far, 4, Scalar(0, 255, 0), -1); } }
}
這樣就可以計(jì)算圖像中輪廓的凸缺陷信息,并繪制凸缺陷。
總結(jié)一下,CONVEXITYDEFECTS()函數(shù)是OpenCV中用于計(jì)算輪廓凸缺陷信息的函數(shù),可以用于手勢(shì)識(shí)別、目標(biāo)檢測(cè)等應(yīng)用場(chǎng)景。使用該函數(shù)時(shí),需要先獲取輪廓和凸包信息,然后使用該函數(shù)計(jì)算凸缺陷信息,并根據(jù)需求對(duì)凸缺陷進(jìn)行處理和繪制。
應(yīng)用:
針對(duì)手勢(shì)進(jìn)行凸缺陷檢測(cè),可以實(shí)現(xiàn)手勢(shì)識(shí)別。此時(shí),僅計(jì)算指縫間的凸缺陷個(gè)數(shù),根據(jù)該值識(shí)別手勢(shì)表示的數(shù)值。
例如
● 有4個(gè)凸缺陷時(shí),手勢(shì)表示數(shù)值5。
● 有3個(gè)凸缺陷時(shí),手勢(shì)表示數(shù)值4。
● 有2個(gè)凸缺陷時(shí),手勢(shì)表示數(shù)值3。
● 有1個(gè)凸缺陷時(shí),手勢(shì)表示數(shù)值2。
● 有0個(gè)凸缺陷時(shí),手勢(shì)可能表示數(shù)值1,也可能表示數(shù)值0。