029-Opencv筆記-凸包

凸包

什么是凸包(Convex Hull)隐锭,在一個多變形邊緣或者內(nèi)部任意兩個點(diǎn)的連線都包含在多邊形邊界或者內(nèi)部觉阅。
正式定義:包含點(diǎn)集合S中所有點(diǎn)的最小凸多邊形稱為凸包

Graham掃描算法

首先選擇Y方向最低的點(diǎn)作為起始點(diǎn)p0,從p0開始極坐標(biāo)掃描缔恳,依次添加p1….pn(排序順序是根據(jù)極坐標(biāo)的角度大小猪杭,逆時針方向)
對每個點(diǎn)pi來說樊拓,如果添加pi點(diǎn)到凸包中導(dǎo)致一個左轉(zhuǎn)向(逆時針方法)則添加該點(diǎn)到凸包纠亚, 反之如果導(dǎo)致一個右轉(zhuǎn)向(順時針方向)刪除該點(diǎn)從凸包中

convexHull(
InputArray points,// 輸入候選點(diǎn),來自findContours
OutputArray hull,// 凸包
bool clockwise,// default true, 順時針方向
bool returnPoints)// true 表示返回點(diǎn)個數(shù)筋夏,如果第二個參數(shù)是vector<Point>則自動忽略

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;
Mat src, src_gray, dst;
int threshold_value = 100;
int threshold_max = 255;
const char* output_win = "convex hull demo";
void Threshold_Callback(int, void*);
RNG rng(12345);

int main(int argc, char** argv) {
    src = imread("D:/girl.jpg");
    //src = imread("D:/cir.png");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    const char* input_win = "input image";
    namedWindow(input_win, CV_WINDOW_AUTOSIZE);
    namedWindow(output_win, CV_WINDOW_NORMAL);
    const char* trackbar_label = "Threshold : ";

    cvtColor(src, src_gray, CV_BGR2GRAY);
    blur(src_gray, src_gray, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);
    imshow(input_win, src_gray);

    createTrackbar(trackbar_label, output_win, &threshold_value, threshold_max, Threshold_Callback);
    Threshold_Callback(0, 0);
    waitKey(0);
    return 0;
}

void Threshold_Callback(int, void*) {
    Mat bin_output;
    vector<vector<Point>> contours;
    vector<Vec4i> hierachy;
    
    threshold(src_gray, bin_output, threshold_value, threshold_max, THRESH_BINARY);
    findContours(bin_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

    vector<vector<Point>> convexs(contours.size());
    for (size_t i = 0; i < contours.size(); i++) {
        convexHull(contours[i], convexs[i], false, true);
    }

    // 繪制
    dst = Mat::zeros(src.size(), CV_8UC3);
    vector<Vec4i> empty(0);
    for (size_t k = 0; k < contours.size(); k++) {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(dst, contours, k, color, 2, 8, hierachy, 0, Point(0, 0));
        drawContours(dst, convexs, k, color, 2, 8, empty, 0, Point(0, 0));
    }
    imshow(output_win, dst);

    return;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂胞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子条篷,更是在濱河造成了極大的恐慌骗随,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴叹,死亡現(xiàn)場離奇詭異鸿染,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乞巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門牡昆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摊欠,你說我怎么就攤上這事丢烘。” “怎么了些椒?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵播瞳,是天一觀的道長。 經(jīng)常有香客問我免糕,道長赢乓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任石窑,我火速辦了婚禮牌芋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘松逊。我一直安慰自己躺屁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布经宏。 她就那樣靜靜地躺著犀暑,像睡著了一般驯击。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耐亏,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天徊都,我揣著相機(jī)與錄音,去河邊找鬼广辰。 笑死暇矫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的择吊。 我是一名探鬼主播李根,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼干发!你這毒婦竟也來了朱巨?” 一聲冷哼從身側(cè)響起史翘,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枉长,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琼讽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體必峰,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年钻蹬,在試婚紗的時候發(fā)現(xiàn)自己被綠了吼蚁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡问欠,死狀恐怖肝匆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顺献,我是刑警寧澤旗国,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站注整,受9級特大地震影響能曾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肿轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一寿冕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椒袍,春花似錦驼唱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捌治。三九已至,卻和暖如春纽窟,著一層夾襖步出監(jiān)牢的瞬間肖油,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工臂港, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留森枪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓审孽,卻偏偏與公主長得像县袱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佑力,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • nav尋路一般包含兩部分式散,首先是使用工具根據(jù)地圖信息生成尋路用的nav mesh,接下來就是在游戲中根據(jù)生成的na...
    _ArayA_閱讀 2,124評論 0 1
  • 1 打颤、凸包的理解 在一個多變形邊緣或者內(nèi)部任意兩個點(diǎn)的連線都包含在多邊形邊界或者內(nèi)部暴拄。正式定義:包含點(diǎn)集合S中所有...
    劉玉春_164c閱讀 667評論 0 0
  • 凸包(Convex Hull)是一個計算幾何(圖形學(xué))中的概念。在一個實數(shù)向量空間中编饺,對于給定集合X乖篷,所有包含X的...
    其實我很菜啊閱讀 3,387評論 0 0
  • 1 什么是叉乘 a×b=c 其中|c|=|a||b|·sinθ c的方向遵守右手定則二維向量的叉乘 ( ...
    氮化鎵加砷閱讀 8,890評論 1 3
  • 1.概念 凸包(Convex Hull)是一個計算幾何(圖形學(xué))中的概念。用不嚴(yán)謹(jǐn)?shù)脑拋碇v透且,給定二維平面上的點(diǎn)集撕蔼,...
    三三de酒閱讀 3,922評論 0 1