OpenCV2馬拉松第24圈 輪廓提取

2021-09-07 10:52:00 字數 2561 閱讀 9752

計算機視覺討論群162501053

收入囊中

葵花寶典

關於輪廓提取,幾乎相同是乙個連通域的推斷。

原理還是比較簡單的。

初識api

c++:void 

findcontours

(inputoutputarrayimage, outputarrayofarrayscontours, outputarrayhierarchy, intmode, intmethod, pointoffset=point()

)c++:void 

findcontours

(inputoutputarrayimage, outputarrayofarrayscontours, intmode, intmethod, pointoffset=point()

)method

.也就是說,不論什麼輪廓上的兩個點都處在乙個九宮格內.

[tehchin89]

offset– 可選的輪廓位移.當分析roi比較實用.

找到輪廓後。就能夠用

drawcontours畫出來

#include "cv.h"

#include "highgui.h"

using

namespacecv;

intmain

(int

argc

,char

**ar**

)namedwindow

("components",1

);imshow

("components"

,dst

);waitkey(0

);}

我們能夠用矩形包圍輪廓

cv::rect r0= cv::boundingrect(cv::mat(contours[0]));

cv::rectangle(result,r0,cv::scalar(0),2);

也能夠用圓

float radius;

cv::point2f center;

cv::minenclosingcircle(cv::mat(contours[1]),center,radius);

cv::circle(result,cv::point(center),static_cast(radius),cv::scalar(0),2);

也能夠用多邊形

也能夠用還有一種多邊形模擬convex hull

std::vectorhull;

cv::convexhull(cv::mat(contours[3]),hull);

也能夠用最小外接矩形

vectorminrect( contours.size() );

for( int i = 0; i < contours.size(); i++ )

也能夠用橢圓

vectorminellipse( contours.size() );

for( int i = 0; i < contours.size(); i++ )

if( contours[i].size() > 5 )

minellipse[i] = fitellipse( mat(contours[i]) );

還有非常多好用的函式

cv::contourarea

預計乙個輪廓的畫素數

cv::pointpolygontest

確定乙個點是在輪廓內韓式輪廓外

cv::matchshapes度量

兩個輪廓的相似度

還有cv::moments用於計算重心等資訊

荷槍實彈

參考1-輪廓提取

參考2-convexhull逼近

參考3-圓與矩形逼近 

參考4-最小外接矩形與橢圓逼近

演算法馬拉松24

n 1個點的多邊形。給外圈的邊標記上1 n,裡圈的邊也標記上1 n,使得對於乙個外圈相鄰點與中間點構成的三角形的邊權之和都相等。n le 10 6 顯然每個三角形權值和為 frac 一開始簡化成n個數排乙個環,相鄰兩個數的和不相等並且有上下界,然後並不好做 構造了一下n 5發現外圈正好1.5,內圈1...

2013騰訊程式設計馬拉松初賽(3月24日)

1 題目一 小q系列故事 最佳裁判 這道題就是找最大值和最小值的題目,學過c的應該都沒問題的。2 題目二 小明系列問題 小明序列 這道題目是最長上公升子串行的一種變形吧,就是子串行中相鄰數的下標之差必須大於d 開始看錯題目,以為是相鄰數之差大於d,結果wa了好多次,最後看了別人的discuss才恍然...

opencv2 學習第12天 複習

include include include using namespace cv using namespace std int g slider position 0 int n 0 cvcapture g cap nullptr void ontrackbarslide int pos vo...