1. 程式人生 > >提取元素的輪廓及形狀描述子

提取元素的輪廓及形狀描述子

先看提取輪廓的程式碼:

  1. Mat image = imread("D:/picture/images/binaryGroup.bmp",0);  
  2. if(!image.data)  
  3.     return -1;  
  4. imshow("源影象",image);  
  5. //獲取輪廓
  6. std::vector> contours;  
  7. //獲取輪廓:
  8. findContours(image,         //影象
  9.     contours,               //輪廓點
  10.                     //包含影象拓撲結構的資訊(可選引數,這裡沒有選)
  11.     CV_RETR_EXTERNAL,           //獲取輪廓的方法(這裡獲取外圍輪廓)
  12.     CV_CHAIN_APPROX_NONE);      //輪廓近似的方法(這裡不近似,獲取全部輪廓)
  13. //列印輪廓資訊
  14. std::cout<<"共有外圍輪廓:"<<contours.size()<<"條"<<std::endl;  
  15. std::vector>::const_iterator itContours = contours.begin();  
  16. for(;itContours != contours.end();++itContours)  
  17. {  
  18.     std::cout<<"每個輪廓的長度: "<<itContours->size()<<std::endl;  
  19. }  

注意到輪廓的儲存格式為std::vector>,他說明整個輪廓是若干條輪廓按一定順序組成的,而每個輪廓中的點也是有順序的。

畫出輪廓就比較簡單了:

  1. //畫出輪廓
  2. Mat result(image.size(),CV_8U,Scalar(255));  
  3. //畫出輪廓,引數為:畫板,輪廓,輪廓指示(這裡畫出所有輪廓),顏色,線粗
  4. drawContours(result,contours,-1,Scalar(0),2);  
  5. imshow("提取外圍輪廓",result);  

還要注意提取輪廓的方法還有很多種,比如CV_RETR_LIST代表所有輪廓

  1. findContours(image,         
    //影象
  2.     contours,               //輪廓點
  3.                     //包含影象拓撲結構的資訊(可選引數,這裡沒有選)
  4.     CV_RETR_LIST,           //獲取輪廓的方法(這裡獲取所有輪廓)
  5.     CV_CHAIN_APPROX_NONE);      //輪廓近似的方法(這裡不近似,獲取全部輪廓
  6. //畫出輪廓
  7. drawContours(result,contours,-1,Scalar(0),2);  
  8. imshow("提取所有輪廓",result);  

通常,這樣提取的輪廓包含一些我們不希望的輪廓(比如一些小洞),或者假如我們知道我們感興趣的物體輪廓的大概範圍時,我們就可以用下面的辦法縮小目標範圍:

  1. //除去太長或者太短的輪廓
  2. int cmin = 100;  
  3. int cmax = 1000;  
  4. std::vector>::const_iterator itc = contours.begin();  
  5. while(itc != contours.end())  
  6. {  
  7.     if(itc->size() < cmin || itc->size() > cmax)  
  8.         itc = contours.erase(itc);  
  9.     else
  10.         ++itc;  
  11. }  
  12. //把結果畫在源影象上:
  13. Mat original = imread("D:/picture/images/group.jpg");  
  14. if(!original.data)  
  15.     return -1;  
  16. drawContours(original,contours,-1,Scalar(255,255,255),2);  
  17. imshow("動物的輪廓",original);  
  18. //將輪廓重繪於白板上
  19. result.setTo(Scalar(255));  
  20. drawContours(result,contours,-1,Scalar(0),1);  


怎麼提取輪廓的特徵呢?OpenCV提供了很多函式,我們展示其中的幾個:

  1. //輪廓的形狀描述子
  2. //外接矩形
  3. Rect r0 = boundingRect(Mat(contours[0]));  
  4. rectangle(result,r0,Scalar(0),2);  
  5. //最小外接圓
  6. float radius;  
  7. Point2f center;  
  8. minEnclosingCircle(Mat(contours[1]),center,radius);  
  9. circle(result,Point(center),static_cast<</span>int>(radius),Scalar(0),2);  
  10. //多邊形估計
  11. std::vector poly;  
  12. //引數為:輸入影象的2維點集,輸出結果,估計精度,是否閉合
  13. approxPolyDP(Mat(contours[2]),poly,5,true);  
  14. std::cout<<"多邊形大小:"<<poly.size()<<std::endl;  
  15. //畫出結果
  16. std::vector::const_iterator itp = poly.begin();  
  17. while(itp != poly.end()-1)  
  18. {  
  19.     line(result,*itp,*(itp+1),Scalar(0),2);  
  20.     ++itp;  
  21. }  
  22. //將第一個點和最後一點連起來
  23. line(result,*(poly.begin()),*(poly.end()-1),Scalar(128),2);  
  24. //計算凸包
  25. std::vector hull;  
  26. convexHull(Mat(contours[3]),hull);  
  27. std::vector::const_iterator it= hull.begin();  
  28. while(it != (hull.end()-1))  
  29. {  
  30.     line(result,*it,*(it+1),Scalar(0),2);  
  31.     ++it;  
  32. }  
  33. line(result,*(hull.begin()),*(hull.end()-1),Scalar(0),2);  
  34. //計算矩資訊
  35. itc = contours.begin();  
  36. while(itc != contours.end())  
  37. {  
  38.     //計算所有的距
  39.     Moments mom = moments(Mat(*itc++));  
  40.     //計算並畫出質心
  41.     circle(result,Point(mom.m10/mom.m00,mom.m01/mom.m00),2,Scalar(2),2);  
  42. }  
  43. imshow("形狀描述子",result);  

我們再次看到,輪廓的確是有順序的。值得注意的是矩資訊:OpenCV提供了一個結構體Moments,它的元素就是計算好的矩資訊,裡面存放了常用的距。

其實,OpenCV還提供了許多其他的形狀描述子,比如函式cv::minAreaRect計算了最小外界傾斜的矩形。函式 cv::contourArea估計輪廓區域的面積(裡面的畫素數)。函式cv::pointPolygonTest計算一個點是否在輪廓 內,cv::matchShapes測量了2兩個輪廓的相似程度等等。這裡就不一一介紹了。

相關推薦

我的OpenCV學習筆記(20):提取元素輪廓形狀描述

先看提取輪廓的程式碼: Mat image = imread("D:/picture/images/binaryGroup.bmp",0); if(!image.data) return -1; imshow("源影象",image); //獲取輪廓 std

提取元素輪廓形狀描述

先看提取輪廓的程式碼: Mat image = imread("D:/picture/images/binaryGroup.bmp",0);   if(!image.data)       return -1;   imshow("源影象",image);   //獲取輪廓 std::vector&

影象形狀特徵(六)--AR模型形狀描述

     兩維的形狀可以用一維的實數或複數函式表示, 把這個函式看成一個隨機過程實現, 通 過估計得到的模型引數就可以作為形狀描述子 . 用自迴歸模型[127]分析閉合形狀是 Kashyap 和Chellappa 在 1981 年首先提出來的, 他 們用自迴歸係數作特徵向量來刻劃形狀 . 在Dubois 和

影象特徵點提取描述彙總:FIST、SURF、FAST、BRIEF、ORB、BRISK、FREAK

SIFT特徵提取及描述子 1 特徵提取 1.1 構建尺度空間 1.2 選取特徵點         一個點如果在DOG尺度空間本層以及上下兩層的26個領域中是最大或最小值時,就認為該點是影象在該尺度下的一個特徵點 1.3 去除不好的特徵點 2 特徵描述子      

學習OpenCV範例(十九)——輪廓提取形狀描述

本範例主要介紹瞭如何提取輪廓和用一些形狀描述符對輪廓進行表述,輪廓提取函式涉及到的引數很多,沒有經常用到它的話,對引數的瞭解就不會太深刻,這裡也按照本人搜尋出來的一些資料進行總結,希望對大家有用。 1、程式碼實現 本程式碼實現了多個功能 建立了三個滑動條: 第一個滑動條表示

7.6提取區域的輪廓,計算區域的形狀描述運算元

#include"opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/core/

(一)ORB描述提取

ORBSLAM2中使用ORB描述子的方法     經典的視覺SLAM系統大體分為兩種:其一是基於特徵點法的,其二是基於直接法的。那麼本文主要就講特徵點法的SLAM。   基於特徵點法的視覺SLAM系統典型的有PTAM,ORBSLAM等。本文主要圍繞ORBSLAM2的方案來闡述特徵點法SLA

(二)ORB描述提取原始碼思路與實現

ORBSLAM2中ORB特徵提取的特點     ORBSLAM2中通過對OpenCV中的ORB特徵點提取類進行修改,對影象進行分塊提取,而後劃分節點,使得每個節點中儲存的特徵點效能是該節點所有特徵點中最好的。   可能按照上面說的方式,大家不太能理解。   這麼說吧。將鋪滿蘋果的桌子進行

CSS相鄰選擇器(>)選擇元素而不包含該元素元素如何讓DIV中的內容垂直居中

1、CSS 相鄰選擇器“>”,其作用是選擇某元素子元素,而不包含該子元素的子元素 <!DOCTYPE HTML> <html> <head> <style type="text/css">

SIFT演算法特徵描述構建---關鍵點定位原理程式碼

0.引言 sift針對區域性特徵進行特徵提取,在尺度空間尋找極值點,提取位置,尺度,旋轉不變數,生成特徵描述子。 總共分四個步驟: step2 關鍵點/極值點提取 2.1 關鍵點位置初步探查 生成DOG金字塔後,要找到DOG空間中的區域

sift演算法特徵描述構建程式碼實現--梯度直方圖生成原理程式碼

0.引言 sift針對區域性特徵進行特徵提取,在尺度空間尋找極值點,提取位置,尺度,旋轉不變數,生成特徵描述子。 總共分四個步驟: step3 生成梯度直方圖 生成特徵點的梯度資訊,並且確定主方向和輔助主方向的關鍵點。 3.1 梯度計算

opencv 特徵點 檢測 描述提取 匹配 篩選

/* * ORB特徵點檢測匹配 * 其他方法還有SIFT * SURF */ #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/features

【OpenCV學習筆記 010】提取直線、輪廓連通區域

一、Canny運算元檢測輪廓   (http://blog.csdn.net/davebobo/article/details/52583167) 1.概念及原理 (1)之前我們是對梯度大小進行閾值化以得到二值的邊緣影象。但是這樣做有兩個缺點。其一是檢測到的邊緣過粗,難以實

【css】浮動的影響解決方法(父元素無高度,而元素有高度)

當一個元素內只包含浮動元素的時候,它會出現高度摺疊,即元素的上下底邊重合,即出現高度為0的情況,這樣會導致後面接著的內容與上面內容出現重疊現象,針對這個問題分享幾種解決方法: 1、直接給父元素設定height ul { list-style-ty

JQuery this和$(this)的區別獲取$(this)元素物件的方法

       首先來看看JQuery中的  $()  這個符號,實際上這個符號在JQuery中相當於JQuery(),即$(this)=jquery();也就是說,這樣可以返回一個jquery物件。那麼,當你在網頁中alert($('#id'));時,會彈出一個[object Object ],這個obj

【特徵匹配】BRIEF特徵描述原理原始碼解析

轉載請註明出處: http://blog.csdn.net/luoshixian099/article/details/48338273   傳統的特徵點描述子如SIFT,SURF描述子,每個特徵點採用128維(SIFT)或者64維(SURF)向量去描述,每個維度上

擴增分析解讀2提取barcode,質控樣品拆分,切除擴增引物

本網對Markdown排版支援較差,請跳轉“巨集基因組”公眾號閱讀; 寫在前面 之前釋出的《擴增子圖表解讀》系列,相信很多朋友都看過了(連結直達7月文章目錄)。 這些內容的初衷是寫給本領域剛進實驗室的學生讀,加速大家對同行文章的解讀能力。如果連同行

SIFT演算法特徵描述構建---特徵描述構建原理程式碼

0.引言 sift針對區域性特徵進行特徵提取,在尺度空間尋找極值點,提取位置,尺度,旋轉不變數,生成特徵描述子。 總共分四個步驟: 4 特徵描述子構建 每個關鍵點的方向、位置、尺度資訊都具備後,可以對區域性特徵進行描述,即特徵描述子。

Opencv中提取影象中的輪廓中心點

// contourStudy.cpp : 定義控制檯應用程式的入口點。 //本文所提取的輪廓具有的特徵: 只有一個無孔洞的內連通 #include "stdafx.h" #include <opencv2/opencv.hpp> #include <iostream> #includ

java selenium (九) 常見web UI 元素操作 API使用

清空 radio send link checkbox list select ttext lba 鏈接(link) <div> <p>鏈接 link</p> <a href="www.cn