目錄
前言
效果展示
檢測(cè)庫(kù)
簡(jiǎn)介
安裝庫(kù)
用法
測(cè)試
論文算法步驟簡(jiǎn)讀
1. lsd 檢測(cè)
2. lsd group
3. 生成初始 ellipse
4. 聚類
前言
橢圓檢測(cè)是工業(yè)中比較常用的一種檢測(cè)需求。目前常用的基于傳統(tǒng)圖像處理的橢圓檢測(cè)方法是霍夫變換,但是霍變換的檢測(cè)率比較低,很難滿足工業(yè)場(chǎng)景。而基于深度學(xué)習(xí)的橢圓檢測(cè),只能用于特定場(chǎng)景下的橢圓檢測(cè),檢測(cè)場(chǎng)景和標(biāo)注數(shù)據(jù)有很大的關(guān)系,很難做到通用。
我無(wú)意中看到一篇橢圓檢測(cè)的論文《An Efficient High-quality Ellipse Detection》,是基于傳統(tǒng)圖像處理算法進(jìn)行的橢圓檢測(cè)。效果很不錯(cuò),對(duì)于標(biāo)準(zhǔn)橢圓的檢測(cè)率很高,并且通用性很不錯(cuò)。但是論文作者只提供了基于matlab的源碼,這么好的論文也沒(méi)有人翻譯成 c++ 庫(kù),所以我在理解原論文的基礎(chǔ)上,經(jīng)過(guò)一些調(diào)參和優(yōu)化,實(shí)現(xiàn)了一個(gè) c++ 版本的橢圓檢測(cè)庫(kù)(MIT LICENSE)效果和效率都很不錯(cuò)。
效果展示
先上圖。
另外可以用我做的demo體驗(yàn)效果。線上體驗(yàn):http://ellipsedetect.xyz/,或者小程序搜索 “橢圓識(shí)別“。
檢測(cè)庫(kù)
簡(jiǎn)介
橢圓檢測(cè)庫(kù)地址:
https://github.com/memory-overflow/standard-ellipse-detection?github.com/memory-overflow/standard-ellipse-detection
該庫(kù)適用于邊界清晰的橢圓檢測(cè)、最好需要檢測(cè)的的橢圓的大小在 200 * 200 像素以上,太小可能會(huì)有漏檢,所以稱之為標(biāo)準(zhǔn)橢圓檢測(cè)。
安裝庫(kù)
庫(kù)的的安裝可以參考倉(cāng)庫(kù)的 wiki進(jìn)行安裝,注意 opencv 的版本一定要用 3.4.x。由于庫(kù)使用了 shared_ptr,需要開(kāi)啟 c++11 及以上標(biāo)準(zhǔn)。
用法
該庫(kù)的用法也很簡(jiǎn)單,您不必了解論文的具體實(shí)現(xiàn)細(xì)節(jié)。代碼中引用頭文件#include "ellipse_detection/detect.h"
,然后 zgh::detectEllipse(...) 調(diào)用。
接口說(shuō)明
bool zgh::detectEllipse(
INPUT const uint8_t *image,
int height,
int width,
OUTPUT std::vector<std::shared_ptr<Ellipse> > &ells,
int polarity = 0,
double line_width = 2.0);
- 輸入?yún)?shù):
- image 圖像原始數(shù)據(jù),灰度圖,彩色圖需要先轉(zhuǎn)換成灰度圖,并且轉(zhuǎn)換成一維數(shù)組輸入
- height 圖像高度
- width 圖像寬度
- polarity 表示橢圓極性,-1、0、1, 默認(rèn)為 0,檢測(cè)所有極性,-1 表示只檢測(cè)內(nèi)部亮,外部暗的橢圓,1 表示只檢測(cè)內(nèi)部暗,外部亮的橢圓,0 表示不關(guān)注橢圓的內(nèi)外部亮度關(guān)系,檢測(cè)所有橢圓。
- line_width 橢圓邊界的線寬,單位像素,推薦使用默認(rèn)值,2 像素。
- 輸出
- ells 檢測(cè)到的橢圓列表
關(guān)于 Ellipse 結(jié)構(gòu)的說(shuō)明
Pointd o; // 橢圓中心點(diǎn)坐標(biāo)
double a, b; // 短半軸長(zhǎng)度,長(zhǎng)半軸長(zhǎng)度
double phi; // 橢圓偏角,單位為弧度
int polarity; // 橢圓極性
double goodness; // 橢圓評(píng)分
double coverangle; // 橢圓角度完整程度
std::vector<Pixel> inliers; // 構(gòu)成的像素點(diǎn)
測(cè)試
提供了1個(gè)測(cè)試工具,可以查看效果。需要桌面版的操作系統(tǒng)才能顯示圖片,如果是服務(wù)器版本的操作系統(tǒng),需要注釋掉 imshow 部分。
cmake3 .. -DBUILD_TESTING=ON
make
./bin/testdetect [image_dir1] [image_dir2] [image_dir3] ...
論文算法步驟簡(jiǎn)讀
如果對(duì)于論文的具體實(shí)現(xiàn)比較感興趣,可以查看該部分內(nèi)容。
該橢圓檢測(cè)方法,主要分成如下4個(gè)步驟:
- lsd: 首先通過(guò) lsd 檢測(cè)算法生成很多細(xì)小的線段。
- lsd group: 通過(guò)搜索方法,將細(xì)小的線段連接成弧線。
- inital ellipse: 通過(guò)組合兩條弧線,可以進(jìn)行橢圓擬合,得到初始橢圓集。
- 聚類:對(duì)初始橢圓進(jìn)行聚類,然后進(jìn)行進(jìn)一步的完整度評(píng)估,篩選出高完整度、高評(píng)分的橢圓。
1. lsd 檢測(cè)
lsd 是一種傳統(tǒng)的線段檢測(cè)算法。它是基于梯度排序以后,通過(guò)查找近似矩形區(qū)域來(lái)獲得線段。通過(guò) lsd 可以提取圖像中的細(xì)小線段,以下圖為例子,
經(jīng)過(guò) lsd 檢測(cè)算法后如下圖,不同的顏色代表一條不同的線段。
2. lsd group
lsd group 的目的是為了把多個(gè)首尾相連的,并且斜率差在一定范圍內(nèi)的線段聚集成一組,組成一段弧。就也是通過(guò)搜索的方法找到連續(xù)的如下結(jié)構(gòu)
如果有多條線段可以選擇,采用一種像素投票機(jī)制,選擇角度閾值內(nèi)像素最多的線段。
如下圖,相同顏色的線段組成了一組弧。
3. 生成初始 ellipse
選擇任意兩條弧線,只要滿足一定的條件,那么這兩個(gè)弧線就可能匹配組成一個(gè)橢圓。
找到所有的這樣的一組弧以后,我們可以通過(guò)組成這些弧的所有像素點(diǎn)擬合出來(lái)一個(gè)橢圓(最小二乘法)。最后得到一個(gè)初始橢圓集。
4. 聚類
初始橢圓集里面,有很多相似的橢圓(橢圓心,長(zhǎng)短軸,偏角都比較接近),對(duì)初始橢圓進(jìn)行聚類,采用均值漂移聚類方法,對(duì)橢圓心,長(zhǎng)短軸,偏角,分別進(jìn)程聚類,得到更少,更具有代表性的橢圓。然后對(duì)這些橢圓進(jìn)行最后的驗(yàn)證,篩選掉完整度不高的橢圓,得到橢圓檢測(cè)的結(jié)果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-465768.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-465768.html
到了這里,關(guān)于高質(zhì)量橢圓檢測(cè)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!