91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Opencv實現輪廓提取功能

發布時間:2020-10-04 09:29:36 來源:腳本之家 閱讀:194 作者:東城青年 欄目:編程語言

輪廓:一個輪廓代表一系列的點(像素),這一系列的點構成一個有序的點集,所以可以把一個輪廓理解為一個有序的點集。

在opencv中,提供了一個函數返回一個有序的點集或者有序的點集的集合(指多個有序的點集),函數findContour是從二值圖像中來計算輪廓的,一般使用Canny()函數處理后的圖像,因為這樣的圖像含有邊緣像素。

尋找輪廓的API函數:

findContours(image,vector<vector<Point>> contours,vector<Vec4i>hierarchy,int mode,int method,Point offset = Point(0,0));

參數解釋:

(1)image:單通道圖像矩陣,一般是經過canny處理后的二值圖像;

(2)contours:vector<vector<Point>>類型,是一個向量,并且是一個雙重向量,向量內每個元素保存了一組由連續的Point點構成的點的集合的向量,每一組Point點集就是一個輪廓。有多少輪廓,向量contours就有多少元素;

(3)hierarchy:vector<Vec4i> 類型, 即容器內每一個元素都是一個包含了4個int型變量的向量,向量內每個元素保存了一個包含4個int整型的數組。向量hiararchy內的元素和輪廓向量contours內的元素是一一對應的,向量的容量相同。hierarchy向量內每一個元素的4個int型變量——hierarchy[i][0] ~hierarchy[i][3],分別表示第i個輪廓的后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號。如果當前輪廓沒有對應的后一個輪廓、前一個輪廓、父輪廓或內嵌輪廓的話,則hierarchy[i][0] ~hierarchy[i][3]的相應位被設置為默認值-1;

(4)mode:int類型的,定義輪廓的檢索模式:

  • CV_RETR_EXTERNAL只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略;
  • CV_RETR_LIST   檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不建立等級關系,彼此之間獨立,沒有等級關系,這就意味著這個檢索模式下不存在父輪廓或內嵌輪廓,所以hierarchy向量內所有元素的第3、第4個分量都會被置為-1,具體下文會講到;
  • CV_RETR_CCOMP  檢測所有的輪廓,但所有輪廓只建立兩個等級關系,外圍為頂層,若外圍內的內圍輪廓還包含了其他的輪廓信息,則內圍內的所有輪廓均歸屬于頂層;
  • CV_RETR_TREE, 檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含內層輪廓,內層輪廓還可以繼續包含內嵌輪廓。   

(5)method:int類型,定義輪廓的近似方法:  

  • CV_CHAIN_APPROX_NONE 保存物體邊界上所有連續的輪廓點到contours向量內;
  • CV_CHAIN_APPROX_SIMPLE 僅保存輪廓的拐點信息,把所有輪廓拐點處的點保存入contours向量內,拐點與拐點之間直線段上的信息點不予保留;
  • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法;                   

(6) Point:偏移量,所有的輪廓信息相對于原始圖像對應點的偏移量,相當于在每一個檢測出的輪廓點上加上該偏移量,一般不偏移取Point(0,0)。

畫輪廓的API函數:

drawContours(Outputimage,contours,hierarchy,int contourIdx,color,int thickness ,int lineType,hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point(0,0))
參數解釋:

    (1)outputimage: 將輪廓畫在該圖上;
    (2)contours:前面尋找到的輪廓;
    (3)contourIdx:是一個索引,代表繪制contours中的第幾個輪廓;
    (4) color:顏色;
    (5)thickness: 線寬;
    (6)lineType: 線型;
    (7)hierarchy:可選層次信息結構,這里面是findContours所的到的基于Contours的層級信息;
    (8)maxLevel: 繪制輪廓的最大等級。如果等級為0,繪制單獨的輪廓。如果為1,繪制輪廓及在其后的相同的級別下輪廓。如果等級為2,繪制所有同級輪廓及所有低一級輪廓,諸此種種。如果值為負數,函數不繪制同級輪廓,但會升序繪制直到級別為abs(max_level)-1的子輪廓;

    (9)offset:照給出的偏移量移動每一個輪廓點坐標.當輪廓是從某些感興趣區域(ROI)中提取的然后需要在運算中考慮ROI偏移量時,將會用到這個參數。

以上定義摘自該篇博客:OpenCV實現輪廓的發現。

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
 
int value = 50;
Mat src, dst, canny_img;
void callback(int, void*);
int main(int arc, char** argv)
{ 
 src = imread("2.jpg");
 namedWindow("src",CV_WINDOW_AUTOSIZE);
 imshow("src", src);
 cvtColor(src, src, CV_BGR2GRAY);
 
 namedWindow("output", CV_WINDOW_AUTOSIZE);
 createTrackbar("threshold", "output", &value, 255, callback);
 callback(0, 0);
 waitKey(0);
 return 0;
}
void callback(int, void*) {
 Canny(src, canny_img, value, 2 * value);
 imshow("canny", canny_img);
 vector<vector<Point>>contours;
 vector<Vec4i>hierarchy;
 findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0));
 
 dst = Mat::zeros(src.size(), CV_8UC3);
 RNG rng(1);
 for (int i = 0; i < contours.size(); i++) { 
 Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
 drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0));
 }
 imshow("output", dst);
} 

運行結果如下:

Opencv實現輪廓提取功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永清县| 都匀市| 晋城| 青冈县| 应用必备| 滨海县| 眉山市| 璧山县| 建平县| 林口县| 台山市| 灌阳县| 泗阳县| 泾川县| 汝城县| 和林格尔县| 新兴县| 剑川县| 盐山县| 桓台县| 镇巴县| 且末县| 萍乡市| 曲阜市| 阿勒泰市| 浮山县| 绥芬河市| 休宁县| 宁波市| 柏乡县| 绿春县| 蓬溪县| 淄博市| 鄂尔多斯市| 冀州市| 太保市| 郁南县| 马公市| 龙山县| 大埔区| 牡丹江市|