opencv的實用研究 分析輪廓並尋找邊界點

2022-01-23 13:58:24 字數 3000 閱讀 6283

opencv的實用研究--分析輪廓並尋找邊界點

​      輪廓是影象處理中非常常見的。對現實中的影象進行取樣、色彩變化、灰度變化之後,能夠處理得到的是「輪廓」。它直接地反應你了需要分析物件的邊界特徵。而對輪廓的分析,實際上也就是對原影象特徵的分析。

在opencv中,已經實現了基礎的輪廓演算法,但是相比較於比如halcon這樣的專業軟體,在輪廓處理這塊的功能還是比較缺乏的。這裡就通過乙個具體問題,說明自己的學習研究。不對之處歡迎批評。

p.s這裡的輪廓處理相關函式,已經包涵在gobase中,具體可以到公告中找github.

一、問題提出

那麼如果對於乙個簡單的影象,比如

已經獲得了最大物體的輪廓,比如

//灰度域變化

threshold(gray,gray,0,255,thresh_binary_inv);

gaussianblur(gray,gray,size(3,3),0,0);

//尋找和繪製輪廓

由於在opencv裡面,輪廓是以

vector>
儲存的,那

麼如何獲得這個輪廓的四個頂點了?

嘗試直接列印輪廓中第乙個點,那麼的確是左上角

但是不具有通用性,在一些比較複雜的上面效果不行,比如

那麼也就是說,必須通過特徵分析的方法獲得已經獲得的輪廓中點的特性,而opencv本身沒有提供相關功能。

二、直觀的解決

現在,對於「左上」和「右下」的兩個點,是比較好分析的。因為在所有的包含在輪廓中的點中,他們乙個是x,y同時最小的,乙個是x,y同時最大的。

比較複雜的是「左下」和"右上"兩個點,

因為他們的數值不是非常有特徵,

比較容易產生混淆。這個時候,如果僅僅是通過x,y值來分析,即使是對於簡單影象,也很難得到穩定的結果。

int itopleft =65535;

int idownright =0;

point ptopleft;

point pdownright;

point pdownleft;

for(int i=0;iidownright)

}int idownleft =65534;

//對於左下的點來說,應該是所有y大於左上的點中,x最小的

for(int i=0;iptopleft.y)

}}

得到結果

nice,在影象中已經明顯的顯示出來了4個邊界點,再加上已經有的兩個點,得到結果不成問題。

四、問題進一步研究

但是這裡其實是用了乙個「投機取巧」的方法,那就是使用影象處理的才使用的harris演算法來分析輪廓。opencv預設實現的harris速度慢且會記憶體移除。用在這個簡單的例子裡面看似可以,但是無法處理現實問題。所以就必須分析原理。

做影象處理有一段時間了,我經常反思回憶,在影象處理中,能夠穩定解決問題的,往往依靠的是「先驗知識,本質特徵」;越是分析逼近影象的本質特徵,越能夠發現穩定的解決方法。比如對於輪廓的角來說,很容易想到處於邊角的點和兩邊的點肯定具有一定的關係,而這種關係具有特徵性。

所以有目的地尋找**,很快就有了成果:

對於我的研究來說,這篇**兩個貢獻:乙個是告知

首先要對影象進行高斯模糊,這個是我之前沒有想到的。特別是對於現實世界中的輪廓,這種方法效果很好。因為邊角經過模糊,那麼還是邊角,但毛刺經過模糊,能夠有效去除。

**中的演算法實現是比較簡單的,並且給出了簡化演算法,直接編碼驗證:

//遍歷輪廓,求出所有支撐角度

int icount = bigestcontour.size();

float fmax = -1;//用於儲存區域性最大值

int imax = -1;

bool bstart = false;

for (int i=0;i0.05)

}else}}

編碼過程中,相比較於原文,有兩處優化(原文中應該也提到了,但是沒有明說):一是通過取模,使得所有的輪廓點都參與運算;二是通過比較,取出角點的區域性最大值。

實現效果,比較理想:

五、小結反思

1、掌握知識,如果不能歸納數學模型,並且編碼實現,不叫真正掌握;

2、分析研究,如果從簡單的情況開始,控制變數,往往能夠左右逢源。

opencv學習 輪廓分析尋找近似圓

這是一張經過處理後的紅燈的影象,我們需要找到其中的紅燈,可以看到是兩個圓,用霍夫圓之後發現其中調參非常麻煩,於是寫了乙個根據輪廓來分析圓的演算法。演算法思想 findcontours 找到影象的輪廓,使用minenclosingcircle 找到輪廓的最小包圍矩形,計算輪廓上的每個點到圓心的距離和半...

OpenCV中的輪廓發現和輪廓繪製

實現 import cv2 import numpy as np 輪廓發現和輪廓繪製 img是一張與binary類似的二值圖,contours是list列表結構每個元素包含乙個邊沿資訊,heriachy是乙個矩陣,用處作者也未知,可以 contours,heriachy cv2.findcontou...

OpenCV 輪廓的凸性

一 概括 理解物體形狀或輪廓的另外一種有用的方法是計算乙個物體的凸包 convex hull 然後計算其凸缺陷 convexity defects 很多複雜物體的特性能很好的被這種缺陷表現出來。二 相關函式 1 發現點集的凸外形 cvseq cvconvexhull2 const cvarr inp...