2018-01-15 橢圓檢測與擬合

橢圓檢測與擬合

歡迎到YangHan's Notebook 橢圓檢測與擬合 獲得更佳閱讀體驗饼记。

實驗目標

  • 調(diào)?CvBox2D cvFitEllipse2( const CvArr* points )實現(xiàn)橢圓擬合

實驗環(huán)境

  • Windows 10 1709
  • OpenCV 3.3

實驗過程

實現(xiàn)了一個fitEllipse()函數(shù),函數(shù)原型如下:

void fitEllipse(char* filename, int threshold);

傳入圖片路徑,然后顯示出圖片橢圓擬合之后的效果。

支持命令行解析圖片路徑參數(shù)。

FitEllipse.exe  test.png

如果沒有路徑參數(shù),默認時當前目錄下的test.png

首先把圖片讀進來鹦肿,包括一份灰度圖和一份原圖。

Mat gray_img = imread(filename, IMREAD_GRAYSCALE);
Mat result = imread(filename);

把灰度圖二值化:

Mat binary_img = gray_img >= thresh;

然后使用findContours()檢測二值化圖像的輪廓點辅柴。

findContours(binary_img, contours, RETR_LIST, CHAIN_APPROX_NONE);

其中箩溃,參數(shù)3可以取值為:

  • RETR_EXTERNEL: 只檢測最外圍輪廓,包含在外圍輪廓內(nèi)的內(nèi)圍輪廓被忽略
  • RETR_LIST: 檢測所有的輪廓碌嘀,包括內(nèi)圍涣旨、外圍輪廓,但是檢測到的輪廓不建立等級關系股冗,彼此之間獨立霹陡,沒有等級關系,這就意味著這個檢索模式下不存在父輪廓或內(nèi)嵌輪廓
  • RETR_CCOMP: 檢測所有的輪廓止状,但所有輪廓只建立兩個等級關系烹棉,外圍為頂層,若外圍內(nèi)的內(nèi)圍輪廓還包含了其他的輪廓信息怯疤,則內(nèi)圍內(nèi)的所有輪廓均歸屬于頂層
  • RETR_TREE: 檢測所有輪廓浆洗,所有輪廓建立一個等級樹結(jié)構。外層輪廓包含內(nèi)層輪廓集峦,內(nèi)層輪廓還可以繼續(xù)包含內(nèi)嵌輪廓伏社。

這里我們只選擇RETR_LIST即可滿足橢圓擬合的要求。

參數(shù)4可以取值為:

  • CHAIN_APPROX_NONE 保存物體邊界上所有連續(xù)的輪廓點到contours向量內(nèi)
  • CHAIN_APPROX_SIMPLE 僅保存輪廓的拐點信息塔淤,把所有輪廓拐點處的點保存入contours向量內(nèi)摘昌,拐點與拐點之間直線段上的信息點不予保留
  • CHAIN_APPROX_TC89_L1, CHAIN_APPROX_TC89_KCOS: 使用teh-Chin Chain 近似算法

這里直接選擇簡單的CHAIN_APPROX_NONE

然后對于檢測出的輪廓點高蜂,用橢圓去擬合:

for each (auto contour in contours)
{
  if (contour.size() < 6) continue;
  RotatedRect box = fitEllipse(contour);
  ellipse(result, box, Scalar(0, 255, 255), 1, LINE_AA);
}

橢圓的擬合至少需要6個點聪黎,所以把少于6個點的檢測結(jié)果直接丟棄,然后對于剩下的點用cv2::fitEllipse()來擬合备恤,然后把橢圓繪制在原圖上稿饰。

之后再保存結(jié)果就行了。

實驗結(jié)果

原圖:

test.png

結(jié)果:

result.png

可以看到橢圓基本上都檢測并擬合出來了烘跺。

心得體會

這次實驗就是先檢測出圖像的輪廓點,然后用fitEllipse()函數(shù)來擬合橢圓脂崔,整體不是太難滤淳。然后注意到一點就是imread()讀入圖片的時候第二個參數(shù)可以選擇讀入的模式,可以用IMREAD_GRAYSCALE讓其讀入單通道的圖片矩陣數(shù)據(jù)砌左。

附:源代碼

// main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

void fitEllipse(char* filename, int threshold);

int main(int argc, char** argv) {
    char* filename;

    if (argc == 2) {
        filename = argv[1];
    }
    else {
        filename = "test.png";
    }


    fitEllipse(filename, 150);
    cvWaitKey(0);
    destroyAllWindows();

    return 0;
}


void fitEllipse(char* filename, int thresh) {

    Mat gray_img = imread(filename, IMREAD_GRAYSCALE);
    Mat result = imread(filename);
    vector<vector<Point>> contours;
    Mat binary_img = gray_img >= thresh;
    findContours(binary_img, contours, RETR_LIST, CHAIN_APPROX_NONE);
    for each (auto contour in contours)
    {
        if (contour.size() < 6) continue;
        RotatedRect box = fitEllipse(contour);
        ellipse(result, box, Scalar(0, 255, 255), 1, LINE_AA);
    }

    imwrite("result.png", result);
    imshow(filename, gray_img);
    imshow("result", result);
}

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脖咐,一起剝皮案震驚了整個濱河市铺敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屁擅,老刑警劉巖偿凭,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異派歌,居然都是意外死亡弯囊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門胶果,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匾嘱,“玉大人,你說我怎么就攤上這事早抠■樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵蕊连,是天一觀的道長悬垃。 經(jīng)常有香客問我,道長甘苍,這世上最難降的妖魔是什么尝蠕? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮羊赵,結(jié)果婚禮上趟佃,老公的妹妹穿的比我還像新娘。我一直安慰自己昧捷,他們只是感情好闲昭,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靡挥,像睡著了一般序矩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跋破,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天簸淀,我揣著相機與錄音,去河邊找鬼毒返。 笑死租幕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拧簸。 我是一名探鬼主播劲绪,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贾富?” 一聲冷哼從身側(cè)響起歉眷,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颤枪,沒想到半個月后汗捡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡畏纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年扇住,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霍骄。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡台囱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出读整,到底是詐尸還是另有隱情簿训,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布米间,位于F島的核電站强品,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屈糊。R本人自食惡果不足惜的榛,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逻锐。 院中可真熱鬧夫晌,春花似錦、人聲如沸昧诱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盏档。三九已至凶掰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜈亩,已是汗流浹背懦窘。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稚配,地道東北人畅涂。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像道川,于是被迫代替她去往敵國和親午衰。 傳聞我的和親對象是個殘疾皇子苹丸,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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