本發(fā)明涉及圓形識別技術(shù)領(lǐng)域,尤其涉及一種基于Hough變化的圓形識別方法及系統(tǒng)。
背景技術(shù):
目前,現(xiàn)有的圓形識別方法,由于識別的圖形非常簡單,導(dǎo)致在復(fù)雜背景里的檢測誤差很大。而且,現(xiàn)有的識別方法匹配速度慢、抗干擾能力弱且檢測精度不高。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是提供一種基于Hough變化的圓形識別方法及系統(tǒng)。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下:
一種基于Hough變化的圓形識別方法,所述圓形識別方法包括:
S1:調(diào)用OpenCV視覺庫,開啟多線程對原始圖像進(jìn)行跳幀處理;
S2:對跳幀處理后的所述原始圖像依次進(jìn)行灰度化、縮放和平滑處理,得到優(yōu)化圖像;
S3:調(diào)用OpenCV視覺庫中的cvHoughCircles函數(shù),對所述優(yōu)化圖像進(jìn)行圓形檢測,得到檢測結(jié)果,所述檢測結(jié)果包括圓心坐標(biāo)和圓半徑;
S4:對每隔預(yù)定幀數(shù)返回的檢測結(jié)果進(jìn)行累加分析和篩選處理,得到最優(yōu)檢測結(jié)果。
本發(fā)明的有益效果是:本技術(shù)方案匹配速度快、抗干擾能力強(qiáng)且檢測精度高;通過對原始圖像進(jìn)行灰度化、縮放以及濾波處理,在保留大量全局特征的基礎(chǔ)上減少了大量的像素點(diǎn),從而加快識別速度;通過把識別運(yùn)算從主進(jìn)程分離出去的方法,很好的解決了場景渲染時(shí)卡頓的問題;通過對OpenCV視覺庫中識別圓的經(jīng)典函數(shù)cvHoughCircles的調(diào)用,可以很理想的獲得識別結(jié)果;通過對多次返回結(jié)果進(jìn)行一定數(shù)量的累積分析,保留穩(wěn)定性高的識別結(jié)果,提高檢測精度。
在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。
優(yōu)選地,所述步驟S2包括:
S21:調(diào)用OpenCV視覺庫,對跳幀處理后的所述原始圖像進(jìn)行灰度化,得到灰度圖像;
S22:根據(jù)所述原始圖像的分辨率大小對所述灰度圖像進(jìn)行縮放處理,得到縮放圖像;
S23:通過5*5高斯卷積核對所述縮放圖像進(jìn)行平滑處理,得到優(yōu)化圖像。
采用上述技術(shù)方案的有益效果:基于不同的圖像格式,運(yùn)用封裝好的OpenCV視覺庫進(jìn)行灰度化,然后使用雙線性內(nèi)插值方法對灰度圖像進(jìn)行縮放,在保證圖像特征不丟失的前提下,去掉了大量噪聲,達(dá)到了加快識別速度的目的;最后對縮放圖像進(jìn)行高斯平滑處理,很好的保留了全局特征,提高識別精度。
優(yōu)選地,所述步驟S3包括:
S31:調(diào)用cvHoughCircles函數(shù)對所述優(yōu)化圖像進(jìn)行圓形檢測,得到多個(gè)輪廓點(diǎn);
S32:在每個(gè)所述輪廓點(diǎn)的梯度方向上,且離每個(gè)所述輪廓點(diǎn)預(yù)設(shè)距離的地方各投一點(diǎn),得到多個(gè)投票點(diǎn);
S33:通過投票閾值法對所有投票點(diǎn)進(jìn)行投票,得到圓心坐標(biāo)和圓半徑。
優(yōu)選地,所述步驟S4包括:
S41:將每次檢測結(jié)果保存在緩存模塊中;
S42:將當(dāng)前檢測結(jié)果與所述緩存模塊中的所有檢測結(jié)果進(jìn)行比較,判斷所述當(dāng)前檢測結(jié)果與所有檢測結(jié)果是否均不為同一圓,若是,將所述當(dāng)前檢測結(jié)果添加進(jìn)所述緩存模塊中,否則,將所述緩存模塊中與所述當(dāng)前檢測結(jié)果為同一圓的檢測結(jié)果累加計(jì)數(shù)并刪除所述當(dāng)前檢測結(jié)果;
S43:將所述緩存模塊中累加計(jì)數(shù)超過預(yù)設(shè)閾值的檢測結(jié)果作為最優(yōu)檢測結(jié)果。
優(yōu)選地,通過Unity引擎或第三方圖像識別SDK開啟相機(jī)來獲取所述原始圖像。
一種基于Hough變化的圓形識別系統(tǒng),所述圓形識別系統(tǒng)包括:
跳幀模塊,用于調(diào)用OpenCV視覺庫,開啟多線程對原始圖像進(jìn)行跳幀處理;
優(yōu)化模塊,用于對跳幀處理后的所述原始圖像依次進(jìn)行灰度化、縮放和平滑處理,得到優(yōu)化圖像;
檢測模塊,用于調(diào)用OpenCV視覺庫中的cvHoughCircles函數(shù),對所述優(yōu)化圖像進(jìn)行圓形檢測,得到檢測結(jié)果,所述檢測結(jié)果包括圓心坐標(biāo)和圓半徑;
篩選模塊,用于對每隔預(yù)定幀數(shù)返回的檢測結(jié)果進(jìn)行累加分析和篩選處理,得到最優(yōu)檢測結(jié)果;
其中,所述跳幀模塊、所述優(yōu)化模塊、所述檢測模塊和所述篩選模塊依次連接。
優(yōu)選地,所述優(yōu)化模塊包括:
第一優(yōu)化子模塊,用于調(diào)用OpenCV視覺庫,對跳幀處理后的所述原始圖像進(jìn)行灰度化,得到灰度圖像;
第二優(yōu)化子模塊,用于根據(jù)所述原始圖像的分辨率大小對所述灰度圖像進(jìn)行縮放處理,得到縮放圖像;
第三優(yōu)化子模塊,用于通過5*5高斯卷積核對所述縮放圖像進(jìn)行平滑處理,得到優(yōu)化圖像;
其中,所述第一優(yōu)化子模塊、所述第二優(yōu)化子模塊和所述第三優(yōu)化子模塊依次連接。
優(yōu)選地,所述檢測模塊包括:
第一檢測子模塊,用于調(diào)用cvHoughCircles函數(shù)對所述優(yōu)化圖像進(jìn)行圓形檢測,得到多個(gè)輪廓點(diǎn);
第二檢測子模塊,用于在每個(gè)所述輪廓點(diǎn)的梯度方向上,且離每個(gè)所述輪廓點(diǎn)預(yù)設(shè)距離的地方各投一點(diǎn),得到多個(gè)投票點(diǎn);
第三檢測子模塊,用于通過投票閾值法對所有投票點(diǎn)進(jìn)行投票,得到圓心坐標(biāo)和圓半徑;
其中,所述第一檢測子模塊、所述第二檢測子模塊和所述第三檢測子模塊依次連接。
優(yōu)選地,所述篩選模塊包括:
第一篩選子模塊,用于將每次檢測結(jié)果保存在緩存模塊中;
第二篩選子模塊,用于將當(dāng)前檢測結(jié)果與所述緩存模塊中的所有檢測結(jié)果進(jìn)行比較,判斷所述當(dāng)前檢測結(jié)果與所有檢測結(jié)果均不為同一圓,若是,將所述當(dāng)前檢測結(jié)果添加進(jìn)所述緩存模塊中,否則,將所述緩存模塊中與所述當(dāng)前檢測結(jié)果為同一圓的檢測結(jié)果累加計(jì)數(shù)并刪除所述當(dāng)前檢測結(jié)果;
第三篩選子模塊,用于將所述緩存模塊中累加計(jì)數(shù)超過預(yù)設(shè)閾值的檢測結(jié)果作為最優(yōu)檢測結(jié)果;
其中,所述第一篩選子模塊、所述第二篩選子模塊和所述第三篩選子模塊依次連接,且均連接所述緩存模塊。
優(yōu)選地,通過Unity引擎或第三方圖像識別SDK開啟相機(jī)來獲取所述原始圖像。
附圖說明
圖1為本發(fā)明的一種基于Hough變化的圓形識別方法的流程示意圖;
圖2為本發(fā)明的一種基于Hough變化的圓形識別方法的流程示意圖;
圖3為本發(fā)明的一種基于Hough變化的圓形識別方法的流程示意圖;
圖4為本發(fā)明的一種基于Hough變化的圓形識別方法的流程示意圖;
圖5為本發(fā)明的一種基于Hough變化的圓形識別系統(tǒng)的結(jié)構(gòu)示意圖;
圖6為本發(fā)明的一種基于Hough變化的圓形識別系統(tǒng)的結(jié)構(gòu)示意圖。
具體實(shí)施方式
以下結(jié)合附圖對本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
如圖1所示,一種基于Hough變化的圓形識別方法,圓形識別方法包括:
S1:調(diào)用OpenCV視覺庫,開啟多線程對原始圖像進(jìn)行跳幀處理;
S2:對跳幀處理后的原始圖像依次進(jìn)行灰度化、縮放和平滑處理,得到優(yōu)化圖像;
S3:調(diào)用OpenCV視覺庫中的cvHoughCircles函數(shù),對優(yōu)化圖像進(jìn)行圓形檢測,得到檢測結(jié)果,檢測結(jié)果包括圓心坐標(biāo)和圓半徑;
S4:對每隔預(yù)定幀數(shù)返回的檢測結(jié)果進(jìn)行累加分析和篩選處理,得到最優(yōu)檢測結(jié)果。
上述實(shí)施例中,運(yùn)用Unity引擎直接開啟相機(jī),或者調(diào)用第三方SDK開啟相機(jī),來獲取實(shí)時(shí)圖像,來得到原始圖像;獲取的原始圖像傳入底層識別庫后,基于當(dāng)前設(shè)備的CPU情況,開啟多線程,做到不影響主進(jìn)程的情況下在其他線程里做識別計(jì)算,計(jì)算完成后返回給主線程識別結(jié)果,并再次傳入新的原始圖像,如此反復(fù),該步驟可以很好的解決了在識別過程中,相機(jī)渲染很卡頓的問題;對跳幀處理后的原始圖像依次進(jìn)行灰度化、縮放和平滑處理,得到優(yōu)化圖像;使用OpenCV開源庫里提供的cvHoughCircles函數(shù),對優(yōu)化圖像進(jìn)行圓形檢測,基于增強(qiáng)現(xiàn)實(shí)下的應(yīng)用,配置相對最優(yōu)的參數(shù),配置參數(shù)主要有區(qū)分不同圓之間的最小距離、運(yùn)用Canny算法對灰度圖像進(jìn)行邊界處理的閾值、投票閾值、識別的最小圓半徑和最大圓半徑,優(yōu)化好的參數(shù),可以極大的提高識別的精度和速度;根據(jù)每幾幀返回的結(jié)果,進(jìn)行一定數(shù)量的累加分析,去掉不穩(wěn)定的識別結(jié)果,保存穩(wěn)定性高的識別結(jié)果,并做到追蹤識別。
如圖2所示,步驟S2包括:
S21:調(diào)用OpenCV視覺庫,對跳幀處理后的原始圖像進(jìn)行灰度化,得到灰度圖像;
S22:根據(jù)原始圖像的分辨率大小對灰度圖像進(jìn)行縮放處理,得到縮放圖像;
S23:通過5*5高斯卷積核對縮放圖像進(jìn)行平滑處理,得到優(yōu)化圖像。
上述實(shí)施例中,基于不同的圖像格式,運(yùn)用封裝好的OpenCV視覺開源庫,進(jìn)行灰度處理,基于原始圖像的分辨率大小對灰度圖像進(jìn)行自定義縮放,縮放方法使用雙線性內(nèi)插值的方法,在保證圖像特征不丟失的前提下,去掉了大量的噪聲,達(dá)到了加快識別速度的目的;最后對縮放圖像進(jìn)行高斯平滑處理,很好的保留圖像的全局特征,優(yōu)化了圖像,提高了識別精度。
如圖3所示,步驟S3包括:
S31:調(diào)用cvHoughCircles函數(shù)對優(yōu)化圖像進(jìn)行圓形檢測,得到多個(gè)輪廓點(diǎn);
S32:在每個(gè)輪廓點(diǎn)的梯度方向上,且離每個(gè)輪廓點(diǎn)預(yù)設(shè)距離的地方各投一點(diǎn),得到多個(gè)投票點(diǎn);
S33:通過投票閾值法對所有投票點(diǎn)進(jìn)行投票,得到圓心坐標(biāo)和圓半徑。
上述實(shí)施例中,使用OpenCV開源庫里提供的cvHoughCircles函數(shù),對優(yōu)化圖像進(jìn)行圓形檢測,此函數(shù)對基礎(chǔ)的Hough變換找圓做了一定的優(yōu)化來提高速度,它不再是在參數(shù)空間畫出一個(gè)完整的圓來進(jìn)行投票,而只是技術(shù)輪廓點(diǎn)處的梯度向量,然后根據(jù)搜索半徑R(預(yù)設(shè)距離)在該梯度方向距離輪廓點(diǎn)預(yù)設(shè)距離R的兩邊各投一點(diǎn),最后根據(jù)投票結(jié)果圖確定圓心位置和半徑,并且基于應(yīng)用的要求,對識別的圓的大小和識別數(shù)量以及投票閾值進(jìn)行最優(yōu)設(shè)定,很好的提高了匹配速度和識別精度。
如圖4所示,步驟S4包括:
S41:將每次檢測結(jié)果保存在緩存模塊中;
S42:將當(dāng)前檢測結(jié)果與緩存模塊中的所有檢測結(jié)果進(jìn)行比較,判斷當(dāng)前檢測結(jié)果與所有檢測結(jié)果是否均不為同一圓,若是,將當(dāng)前檢測結(jié)果添加進(jìn)緩存模塊中,否則,將緩存模塊中與當(dāng)前檢測結(jié)果為同一圓的檢測結(jié)果累加計(jì)數(shù)并刪除當(dāng)前檢測結(jié)果;
S43:將緩存模塊中累加計(jì)數(shù)超過預(yù)設(shè)閾值的檢測結(jié)果作為最優(yōu)檢測結(jié)果。
上述實(shí)施例中,優(yōu)先記錄最新識別到的圓放入設(shè)定好的緩存中;比較緩存中的圓心坐標(biāo)與當(dāng)前結(jié)果的圓心坐標(biāo),兩中心坐標(biāo)距離在一定閾值的判斷為同一個(gè)圓,更新在相應(yīng)緩存中并累加計(jì)數(shù),將緩存中沒有被更新的結(jié)果刪除掉并寫入當(dāng)前結(jié)果中發(fā)現(xiàn)的新圓;當(dāng)緩存中存在累加計(jì)數(shù)超過一定閾值的結(jié)果,判定為穩(wěn)定性高的識別結(jié)果,并做追蹤識別,輸出相應(yīng)的中心坐標(biāo)和半徑。
如圖5所示,一種基于Hough變化的圓形識別系統(tǒng),圓形識別系統(tǒng)包括:
跳幀模塊1,用于調(diào)用OpenCV視覺庫,開啟多線程對原始圖像進(jìn)行跳幀處理;
優(yōu)化模塊2,用于對跳幀處理后的原始圖像依次進(jìn)行灰度化、縮放和平滑處理,得到優(yōu)化圖像;
檢測模塊3,用于調(diào)用OpenCV視覺庫中的cvHoughCircles函數(shù),對優(yōu)化圖像進(jìn)行圓形檢測,得到檢測結(jié)果,檢測結(jié)果包括圓心坐標(biāo)和圓半徑;
篩選模塊4,用于對每隔預(yù)定幀數(shù)返回的檢測結(jié)果進(jìn)行累加分析和篩選處理,得到最優(yōu)檢測結(jié)果;
其中,跳幀模塊1、優(yōu)化模塊2、檢測模塊3和篩選模塊4依次連接。
如圖6所示,優(yōu)化模塊2包括:
第一優(yōu)化子模塊21,用于調(diào)用OpenCV視覺庫,對跳幀處理后的原始圖像進(jìn)行灰度化,得到灰度圖像;
第二優(yōu)化子模塊22,用于根據(jù)原始圖像的分辨率大小對灰度圖像進(jìn)行縮放處理,得到縮放圖像;
第三優(yōu)化子模塊23,用于通過5*5高斯卷積核對縮放圖像進(jìn)行平滑處理,得到優(yōu)化圖像;
其中,第一優(yōu)化子模塊21、第二優(yōu)化子模塊22和第三優(yōu)化子模塊23依次連接。
如圖6所示,檢測模塊3包括:
第一檢測子模塊31,用于調(diào)用cvHoughCircles函數(shù)對優(yōu)化圖像進(jìn)行圓形檢測,得到多個(gè)輪廓點(diǎn);
第二檢測子模塊32,用于在每個(gè)輪廓點(diǎn)的梯度方向上,且離每個(gè)輪廓點(diǎn)預(yù)設(shè)距離的地方各投一點(diǎn),得到多個(gè)投票點(diǎn);
第三檢測子模塊33,用于通過投票閾值法對所有投票點(diǎn)進(jìn)行投票,得到圓心坐標(biāo)和圓半徑;
其中,第一檢測子模塊31、第二檢測子模塊32和第三檢測子模塊33依次連接。
如圖6所示,篩選模塊4包括:
第一篩選子模塊41,用于將每次檢測結(jié)果保存在緩存模塊44中;
第二篩選子模塊42,用于將當(dāng)前檢測結(jié)果與緩存模塊44中的所有檢測結(jié)果進(jìn)行比較,判斷當(dāng)前檢測結(jié)果與所有檢測結(jié)果是否均不為同一圓,若是,將當(dāng)前檢測結(jié)果添加進(jìn)緩存模塊44中,否則,將緩存模塊44中與當(dāng)前檢測結(jié)果為同一圓的檢測結(jié)果累加計(jì)數(shù)并刪除當(dāng)前檢測結(jié)果;
第三篩選子模塊43,用于將緩存模塊44中累加計(jì)數(shù)超過預(yù)設(shè)閾值的檢測結(jié)果作為最優(yōu)檢測結(jié)果;
其中,第一篩選子模塊41、第二篩選子模塊42和第三篩選子模塊43依次連接,且均連接緩存模塊44。
通過Unity引擎或第三方圖像識別SDK開啟相機(jī)來獲取原始圖像。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。