OpenCV輪廓檢測

2021-08-30 13:24:08 字數 3214 閱讀 1380

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

《【opencv入門指南】第三篇canny邊緣檢測》中介紹了邊緣檢測,本篇介紹輪廓檢測,輪廓檢測的原理通俗的說就是掏空內部點,比如原圖中有3*3的矩形點。那麼就可以將中間的那一點去掉。

在opencv中使用輪廓檢測是非常方便。直接使用cvfindcontours函式就能完成對影象輪廓的檢測。下面就來看看這個函式的用法。

一.關鍵函式

1.1  cvfindcontours

函式功能:對影象進行輪廓檢測,這個函式將生成一條鍊錶以儲存檢測出的各個輪廓資訊,並傳出指向這條煉表表頭的指標。

函式原型:

int

cvfindcontours

函式說明:

第乙個引數表示輸入影象,必須為乙個8位的二值影象。影象的二值化請參見《【opencv入門指南】第四篇影象的二值化》。

第二引數表示儲存輪廓的容器。為cvmemstorage型別,定義在opencv的\core\types_c.h中。

第三個引數為輸出引數,這個引數將指向用來儲存輪廓資訊的煉表表頭。

第四個引數表示儲存輪廓鍊錶的表頭大小,當第六個引數傳入cv_chain_code時,要設定成sizeof(cvchain),其它情況統一設定成sizeof(cvcontour)。

第五個引數為輪廓檢測的模式,有如下取值:

cv_retr_external:只檢索最外面的輪廓;

cv_retr_list:檢索所有的輪廓,並將其儲存到一條鍊錶當中;

cv_retr_ccomp:檢索所有的輪廓,並將他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;

cv_retr_tree:檢索所有的輪廓,並重構巢狀輪廓的整個層次,可以參見下圖。

第六個引數用來表示輪廓邊緣的近似方法的,常用值如下所示:

cv_chain_code:以freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。

第七個引數表示偏移量,比如你要從影象的(100, 0)開始進行輪廓檢測,那麼就傳入(100, 0)。

使用cvfindcontours函式能檢測出影象的輪廓,將輪廓繪製出來則需要另一函式——cvdrawcontours來配合了。下面介紹cvdrawcontours函式。

1.2  cvdrawcontours

函式功能:在影象上繪製外部和內部輪廓

函式原型:

void

cvdrawcontours

(cvarr *img, cvseq* contour, cvscalar external_color, cvscalar hole_color, int max_level, int thickness=1, int line_type=8, cvpoint offset=cvpoint(0,0));

第乙個引數表示輸入影象,函式將在這張影象上繪製輪廓。

第二個引數表示指向輪廓鍊錶的指標。

第三個引數和第四個引數表示顏色,繪製時會根據輪廓的層次來交替使用這二種顏色。

第五個引數表示繪製輪廓的最大層數,如果是0,只繪製contour;如果是1,追加繪製和contour同層的所有輪廓;如果是2,追加繪製比contour低一層的輪廓,以此類推;如果值是負值,則函式並不繪製contour後的輪廓,但是將畫出其子輪廓,一直到abs(max_level) - 1層。

第六個引數表示輪廓線的寬度,如果為cv_filled則會填充輪廓內部。

第七個引數表示輪廓線的型別。

第八個引數表示偏移量,如果傳入(10,20),那繪製將從影象的(10,20)處開始。

二.示例程式**

下面用乙個非常簡單的例子展示如何使用輪廓檢測。

//影象的輪廓檢測上  

//by morewindows ( 

#include

using

namespace

std;  #pragma comment(linker, "/subsystem:\"windows\" /entry:\"maincrtstartup\"") 

intmain

( int argc, char** argv )

執行結果如下圖所示:

由圖可以看出,輪廓線已經按層次交替的繪製成功了,讀者可以修改程式中的cvdrawcontours中的nlevels引數,看看圖形會有什麼變化。

**如下:

//影象的輪廓檢測下

//by morewindows (

#include

using

namespace

std;#pragma comment(linker, "/subsystem:\"windows\" /entry:\"maincrtstartup\"")iplimage *g_pgrayimage = null;const

char *pstrwindowsbinarytitle = "二值圖(";const

char *pstrwindowsoutlinetitle = "輪廓圖(";cvseq *g_pcvseq = null;void

on_trackbar

(int pos)

intmain

( int argc, char** argv )

程式執行結果如下所示:

可以明顯看出,由於影象的二值化處理只是根據影象中單個畫素的值來決定,因此這種最簡單輪廓檢測所產生的結果和人眼觀測的實際感覺肯定是有比較大的區別的。

void* src_seq, int header_size, cvmemstorage* storage, int method, double parameter, int parameter2 cv_default(0));

歡迎關注微博:

給我老師的人工智慧教程打call!

OpenCV 閉合輪廓檢測

這個好像是骨頭什麼的,但是要求輪廓閉合,於是對進行一下膨脹操作,再次檢測輪廓就好了。a closed contour.cpp 定義控制台應用程式的入口點。include stdafx.h findrotation angle.cpp 定義控制台應用程式的入口點。findcontours.cpp 定義...

OpenCV 閉合輪廓檢測

這個好像是骨頭什麼的,但是要求輪廓閉合,於是對進行一下膨脹操作,再次檢測輪廓就好了。a closed contour.cpp 定義控制台應用程式的入口點。include stdafx.h findrotation angle.cpp 定義控制台應用程式的入口點。findcontours.cpp 定義...

OpenCV學習 輪廓檢測與重繪

出處 提取模式.cv retr external 只提取最外層的輪廓 cv retr list 提取所有輪廓,並且放置在 list 中 cv retr ccomp 提取所有輪廓,並且將其組織為兩層的 hierarchy 頂層為連通域的外圍邊界,次層為洞的內層邊界。cv retr tree 提取所有輪...