999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

面向物聯(lián)網(wǎng)應(yīng)用的彩碼識(shí)別技術(shù)研究*

2018-03-13 01:18:36張恒麗李林森李建華周國民
通信技術(shù) 2018年2期
關(guān)鍵詞:排序方法

張恒麗,李林森,李建華,周國民

0 引 言

如今,無論是公共自行車、食堂三餐還是溝通聯(lián)系,都離不開移動(dòng)互聯(lián)網(wǎng)。其中,二維碼已經(jīng)融入到人們的吃穿住行,給人們帶來了諸多便利。“掃碼”不只是一種工具,更成為一種生活方式。本文討論一種基于彩色光學(xué)識(shí)別的、極簡(jiǎn)的、先進(jìn)的物聯(lián)網(wǎng)技術(shù)——彩碼。顧名思義,彩碼不同于二維碼,是由彩色色塊組成的矩形碼。

彩碼是在傳統(tǒng)二維碼基礎(chǔ)上加上紅黃藍(lán)等色彩矩陣構(gòu)成的彩色三維矩陣碼,是全球第三代條碼技術(shù)的代表。對(duì)比當(dāng)前常見的二維碼技術(shù),彩碼具有安全性強(qiáng)、識(shí)別率高、生產(chǎn)成本低、信息容量大、抗畸變性強(qiáng)等特點(diǎn)。一般的商品以及報(bào)紙、雜志都可以附有彩碼,簡(jiǎn)單、便捷。

在國外,彩碼的應(yīng)用已經(jīng)比較普遍[1]。2015年,意大利米蘭世博會(huì),日本館便采用了彩碼技術(shù);在東京書店、名古屋的圖書館,都可以看見彩碼的應(yīng)用實(shí)例。在韓國,彩碼的使用已經(jīng)普及到百姓生活的方方面面,戶外屏幕、廣告牌、雜志、商品、電影海報(bào)隨處可見各式彩碼。可見,它比以往的識(shí)別方式具有更大的優(yōu)越性和更廣泛的應(yīng)用空間。

但是,在國內(nèi),彩碼的發(fā)展尚處于起步階段[2]。目前,國內(nèi)學(xué)術(shù)界對(duì)彩碼的研究主要涉及彩碼的設(shè)計(jì)、讀取和安全性等。陳錦昌等結(jié)合計(jì)算機(jī)科學(xué)與藝術(shù)設(shè)計(jì)兩個(gè)領(lǐng)域,對(duì)彩碼進(jìn)行再設(shè)計(jì)[3];盛健等提出了彩碼的信息讀入和讀取的基本思路[4];孫向華等為保證彩碼的版權(quán)保護(hù),提出了基于奇異值分解的零水印算法[5]。但是,這些研究尚處于理論階段,并未得到實(shí)踐的驗(yàn)證。

本文基于對(duì)三色彩碼的色塊定位和提取,完成了對(duì)彩碼的解碼,成功驗(yàn)證了ID的輸出。同時(shí),對(duì)識(shí)別過程中可能遇到的問題進(jìn)行分析和解決,如色塊的偏移、彩碼的雜點(diǎn)等。根據(jù)所查閱的文獻(xiàn),還未有學(xué)者研究類似算法。

本文通過兩種方案來識(shí)別彩碼。方案一采用輪廓提取與中心點(diǎn)排序算法,在PC中通過Opencv2.4.10和Visual Studio 2012實(shí)現(xiàn);方案二是在方案一的算法基礎(chǔ)上,增加聚類算法和抗干擾算法,通過Android Studio進(jìn)行安卓手機(jī)的APP開發(fā)。

本文的結(jié)構(gòu)如下:第1部分為輪廓提取與中心點(diǎn)排序算法及其實(shí)現(xiàn);第2部分為改進(jìn)的聚類算法和抗干擾算法及其實(shí)現(xiàn);第3部分為結(jié)論。

1 輪廓提取與中心點(diǎn)排序算法及其實(shí)現(xiàn)

彩碼標(biāo)簽的結(jié)構(gòu)為,選擇多種可見光顏色,分別繪制矩形色塊,通過不同顏色的矩形色塊的組合標(biāo)識(shí)標(biāo)簽的識(shí)別號(hào),即ID號(hào)。其中,矩形色塊相互之間用填充色黑色進(jìn)行分隔。

假設(shè)彩色矩形碼標(biāo)簽上設(shè)置有ROW×COL的矩形色塊陣列,分別著色為R、B、Y,即對(duì)應(yīng)紅色、藍(lán)色、黃色。其中:定義紅色為0,藍(lán)色為1,黃色為2;ROW=3、COL=8分別為矩形色塊陣列的行標(biāo)和列標(biāo)[6]。

本代碼實(shí)現(xiàn)的功能是識(shí)別計(jì)算機(jī)中存入的一張彩碼圖片。本文利用軟件Opencv2.4.10和Visual Studio 2012實(shí)現(xiàn)識(shí)別彩色矩形碼的基本算法,并輸出彩碼的ID編號(hào)。

1.1 畫出色塊的輪廓

首先,在電腦中導(dǎo)入一張彩色矩形碼標(biāo)簽的圖片,如圖1所示。程序讀入并顯示圖片,圖片名稱為origin。

圖1 彩色矩形碼標(biāo)簽的圖片

色塊提取過程中,為了后續(xù)能夠更方便地找出色塊中心點(diǎn)并排序,因此需要檢測(cè)出色塊的邊緣輪廓。具體方法如下。

取origin中紅色色塊的結(jié)果,并顯示為result;設(shè)置提取紅色色塊的方法為getRedImage;傳入?yún)?shù)是1個(gè)圖像Mat;所有像素點(diǎn)的行數(shù)和列數(shù)就是圖像的高和寬;BGR表示每個(gè)像素點(diǎn)有3個(gè)顏色通道——紅綠藍(lán);對(duì)圖像的行和列進(jìn)行遍歷,取Mat中每個(gè)像素點(diǎn)對(duì)應(yīng)的坐標(biāo)。

所有顏色都是由BGR 3個(gè)通道來表示的。通過在線顏色選擇器進(jìn)行實(shí)驗(yàn),發(fā)現(xiàn):

①當(dāng)滿足(r-b>70)&&(g-b>50)時(shí),認(rèn)為色塊是黃色;

②當(dāng)滿足(b-r>75)&&(b>g)時(shí),認(rèn)為色塊是藍(lán)色;

③當(dāng)滿足(r-g>60)&&(r-b>65)的時(shí)候,認(rèn)為色塊是紅色。

同時(shí),把對(duì)應(yīng)的紅色色塊的row和col置為白色,其他不滿足紅色的色塊置為黑色,從而得到result。圖2為紅色色塊置白(其余色塊置黑)的圖片。以此類推,可以同樣得到藍(lán)色色塊或黃色色塊置為白色的result圖片。

圖2 紅色色塊置白(其余色塊置黑)的圖片

畫出白色區(qū)域的輪廓。以黃色色塊為例,通過findContours勾勒黃色色塊的輪廓,并存儲(chǔ)輪廓上的所有點(diǎn)。通過drawContours繪制輪廓,就能在contours窗口上顯示黃色色塊的輪廓[7],如圖3所示。

圖3 黃色色塊的輪廓

1.2 計(jì)算色塊中心點(diǎn)

計(jì)算每個(gè)contour的中心點(diǎn)。因?yàn)檫@是一個(gè)有序的序列,即從左往右、從上往下排序編碼的,所以必須得有順序。比如,黃色對(duì)應(yīng)的編碼為2,為了區(qū)分所有黃色色塊的位置,就要根據(jù)中心點(diǎn)來判斷。同一行中,左邊色塊中心點(diǎn)的x必定小于右邊色塊中心點(diǎn)的x,且y處于同一行。當(dāng)y值處于比較接近的值時(shí),說明它們處在同一行。所以,首先區(qū)分它們是否處于同一行,然后區(qū)分處于哪一列。

以紅色色塊為例。計(jì)算每個(gè)色塊的中心點(diǎn),并畫出中心點(diǎn)。其中,centerMoments是所有中心點(diǎn)的坐標(biāo)。如果傳入的是藍(lán)色色塊,那么中心點(diǎn)就是藍(lán)色的中心點(diǎn);如果傳入的是黃色色塊,那么中心點(diǎn)就是黃色的中心點(diǎn)。最后的結(jié)果是所有紅黃藍(lán)色塊的中心點(diǎn)集合[8],如圖4所示。

圖4 所有紅黃藍(lán)色塊的中心點(diǎn)集合

1.3 中心點(diǎn)排序

現(xiàn)在把這些中心點(diǎn)組合起來進(jìn)行排序。先進(jìn)行y值排序。y值只有3個(gè)值,且每一行的y值是相等的。首先分別取得紅黃藍(lán)中心點(diǎn)y值的最大值和最小值,得出所有點(diǎn)的最大值和最小值。其中,最小值是第一行,最大值是最后一行,兩個(gè)相加除以2就是第二行的坐標(biāo),從而可以把每一行區(qū)分開來,進(jìn)而把紅色色塊的中心點(diǎn)分別分配到對(duì)應(yīng)的行(row_01,row_02,row_03)。同樣地,分配藍(lán)色和黃色色塊的中心點(diǎn)。具體步驟如下:

定義maxVerticalValue=0;

minVerticalValue=10000;

遍歷所有紅色點(diǎn)集

當(dāng)maxVerticalValue小于紅色點(diǎn)集y值,則將y值賦于maxVerticalValue;

同樣地,當(dāng)minVerticalValue大于紅色點(diǎn)集y值,則將y值賦于minVerticalValue。

遍歷完成后得到第一行的y坐標(biāo),即為minVerticalValue;

第三行的y坐標(biāo)為maxVerticalValue;

第二行的x坐標(biāo)為(maxVerticalValue+minVertic alValue)/2;

定義row_01、row_02、row_03為第一行、第二行、第三行的點(diǎn)集。

遍歷紅色點(diǎn)集,將點(diǎn)集分別push到row_01、row_02、row_03。

此時(shí),line01表示第一行所有點(diǎn)的集合,line02和line03同理。此時(shí),x值是亂序的,因此要對(duì)每一行的8個(gè)x進(jìn)行排序。x值小,說明靠左端;x值大,說明靠右端。以第一行為例,進(jìn)行x的升序排序:遍歷第一行的點(diǎn),對(duì)第一行的點(diǎn)x坐標(biāo)進(jìn)行升序排序。

sort(第一行起始橫坐標(biāo),第一行末尾橫坐標(biāo));

當(dāng)知道每個(gè)點(diǎn)的坐標(biāo)順序后,需要找出這些坐標(biāo)對(duì)應(yīng)的顏色。首先,定義sortedRow_01為第一行排序后的點(diǎn)。然后,遍歷第一行的點(diǎn)。當(dāng)?shù)谝恍械狞c(diǎn)x坐標(biāo)與排序后的x坐標(biāo)值相等時(shí),將此點(diǎn)push到sortedRow_01中,完成第一行點(diǎn)從左往右的排序[9]。

1.4 輸出彩碼ID

將某個(gè)中心點(diǎn)坐標(biāo)放入紅黃藍(lán)集合中進(jìn)行搜索。當(dāng)這個(gè)坐標(biāo)與其中一點(diǎn)相等時(shí),認(rèn)為色塊與顏色相互對(duì)應(yīng)。由此,計(jì)算出第一行的顏色。第二行與第三行類似。最后,程序計(jì)算出整個(gè)彩色矩形碼的ID,如圖5所示。

圖5 彩色矩形碼的ID

2 改進(jìn)的聚類算法和抗干擾算法及其實(shí)現(xiàn)

此方案中,采用與方案一同樣的彩碼結(jié)構(gòu)。本節(jié)代碼在安卓手機(jī)上進(jìn)行APP開發(fā),實(shí)現(xiàn)識(shí)別彩碼并輸出相應(yīng)編碼的功能。

2.1 通過計(jì)算機(jī)執(zhí)行Android程序的過程

在Android手機(jī)上運(yùn)行。

(1)手機(jī)設(shè)置

①將安卓手機(jī)用USB連線連接到電腦上;

②開啟安卓手機(jī)上的USB調(diào)試選項(xiàng)。

(2)從Android Studio運(yùn)行程序

②出現(xiàn)Choose Device窗口,選擇連接電腦的安卓手機(jī),點(diǎn)擊OK。

這樣,Android Studio會(huì)把應(yīng)用程序安裝到手機(jī)設(shè)備,并啟動(dòng)程序進(jìn)行運(yùn)行。

2.2 Android開發(fā)相關(guān)概念

在Android開發(fā)中有著重要的4大組件——activity顯示界面,service服務(wù),Broadcast Receiver廣播和Content Provider數(shù)據(jù)通信。其中,Activity組件負(fù)責(zé)與用戶交互。具體地,在單獨(dú)的屏幕上顯示一些控件,并監(jiān)聽處理用戶的事件,從而做出相應(yīng)響應(yīng)。

Activity有4種基本狀態(tài):Running、Paused、Stopped和Killed,即運(yùn)行、暫停、停止和刪除狀態(tài)[10]。

Running:當(dāng)啟動(dòng)一個(gè)Activity時(shí),它被激活。

Paused:?jiǎn)?dòng)一個(gè)透明的或新的非全屏的Activity時(shí),之前的Activity雖然仍然可見,但不可與用戶交互,即失去了焦點(diǎn),此時(shí)的狀態(tài)稱之為Paused。

Stopped:當(dāng)新的Activity完全覆蓋了之前的Activity,導(dǎo)致之前的窗口被隱藏,不可見的時(shí)候,之前的Activity進(jìn)入Stopped狀態(tài),即停止?fàn)顟B(tài)。

Killed:當(dāng)Activity處于Paused或Stopped狀態(tài)時(shí),系統(tǒng)可將此Activity從內(nèi)存中刪除。此時(shí),該Activity就被Killed了。若要再次顯示該Activity,必須從頭開始。

當(dāng)一個(gè)Activity實(shí)例被創(chuàng)建、刪除或啟動(dòng)其他Activity時(shí),它就在這四種狀態(tài)中進(jìn)行轉(zhuǎn)換。

Android通過Activity棧來管理Activity,而前臺(tái)的Activity處于棧頂。此時(shí)分兩種情況來看。第一種情況,當(dāng)前臺(tái)Activity被刪除時(shí),棧中第二層的Activity將上浮到棧頂,從而被激活。第二種情況,當(dāng)有一個(gè)新的Activity入棧時(shí),原來的Activity會(huì)被壓入到棧的第二層。因此,Activity在不同狀態(tài)間的轉(zhuǎn)換與它在棧中的位置變化密切相關(guān)。

Activity典型的生命周期,如圖6所示(在有用戶參與的情況下,Activity的生命周期過程)。

圖6 Activity典型的生命周期

如圖6所示,Activity經(jīng)過了從創(chuàng)建、運(yùn)行、停止到刪除的生命周期過程。下面將逐一介紹它們的調(diào)用時(shí)機(jī)[11]。

onCreate:這是Activity生命周期的第一個(gè)調(diào)用方法,是在創(chuàng)建Activity時(shí)回調(diào)。可以根據(jù)需要重寫該方法,以此做一些初始化操作。比如,通過setContentView()函數(shù)填充屏幕的用戶界面;通過findViewById()返回xml中定義的視圖或組件的ID等。

onStart:此方法被回調(diào)時(shí),說明Activity正在啟動(dòng),但還沒有在前臺(tái)顯示,因此無法與用戶進(jìn)行交互。此時(shí),Activity已處于可見狀態(tài),只是無法看見。

onResume:當(dāng)調(diào)用此方法時(shí),Activity已在前臺(tái)可見,可以與用戶進(jìn)行交互。此時(shí),Activity處于前面所說的Running狀態(tài)。由此可以看出,onResume與onStart方法有一個(gè)相同點(diǎn),即兩者都表示Activity可見。不同在于onStart回調(diào)時(shí),Activity在后臺(tái),無法與用戶交互;而onResume回調(diào)時(shí),Activity已顯示在前臺(tái),能夠與用戶交互。從流程圖中看到,Activity執(zhí)行onPause()方法后,也有可能通過調(diào)用onResume()方法重新回到前臺(tái)。同樣地,也可以在onResume方法中進(jìn)行一些初始化操作,如初始化在onPause中釋放資源的控件,同時(shí)主動(dòng)觸發(fā)Activity在進(jìn)入onResume時(shí)發(fā)生的所有初始化。

onPause:此方法被回調(diào)時(shí),表示Activity正在停止,此時(shí)Activity進(jìn)入Paused狀態(tài),表示當(dāng)前Activity失去焦點(diǎn)。比如,來電話時(shí),系統(tǒng)自動(dòng)調(diào)用onPause()方法。從圖1可以看到兩種情況。一種情況是上述onResume中所說的,在onPause方法執(zhí)行后,由于用戶操作,使得當(dāng)前Activity退居后臺(tái)后又迅速回到當(dāng)前Activity。因此,Activity會(huì)調(diào)用onResume方法。另一種情況更普遍,即在執(zhí)行完onPause后,Activity會(huì)緊接著回調(diào)onStop,具體見下面描述。同樣,在onPause中能夠執(zhí)行一些操作,如存儲(chǔ)數(shù)據(jù)、停止動(dòng)畫或回收資源等,但這些操作不能太耗費(fèi)時(shí)間。因?yàn)橹挥姓{(diào)用完onPause()方法后,新的Activity的onResume方法才會(huì)被調(diào)用。所以,如果操作耗時(shí),將會(huì)影響到新的Activity的顯示。

onStop:通常情況下,onPause方法執(zhí)行完成后便會(huì)立即執(zhí)行onStop方法,表示Activity即將停止或者完全被覆蓋。此時(shí),Activity進(jìn)入Stopped狀態(tài),Activity不可見,僅在后臺(tái)運(yùn)行。當(dāng)然,onStop方法可以釋放不再需要的資源,但不能太耗時(shí)。

onRestart:當(dāng)Activity從不可見狀態(tài)變?yōu)榭梢姞顟B(tài)時(shí),該方法被調(diào)用,說明Activity重新啟動(dòng)。例如,當(dāng)用戶暫停一個(gè)Activity而打開一個(gè)新的Activity時(shí),系統(tǒng)執(zhí)行onPause和onStop,之后用戶如果又回到之前被暫時(shí)停止的Activity頁面,onRestart就會(huì)被回調(diào)。

onDestroy:這是生命周期中最后一個(gè)執(zhí)行的方法,表示Activity正在被銷毀。執(zhí)行此方法后,系統(tǒng)銷毀了這個(gè)Activity占據(jù)的內(nèi)存空間。如果要再次進(jìn)入這個(gè)Activity,那么需要重新創(chuàng)建,回調(diào)onCreate()方法。

2.3 實(shí)現(xiàn)彩碼識(shí)別

在編寫識(shí)別彩碼的代碼過程中,有3種基本標(biāo)簽:文字TextView、圖片ImageView和按鈕Button。TextView設(shè)置的是屏幕上的Result字樣。setOnClickListener是設(shè)置當(dāng)點(diǎn)擊按鈕時(shí)進(jìn)行監(jiān)聽,當(dāng)按下按鈕時(shí)把結(jié)果改掉,啟動(dòng)計(jì)算,并把結(jié)果放到TextView中。

這里設(shè)計(jì)了一個(gè)函數(shù),稱為findContoursAndDraw。由于圖像會(huì)有很大的噪聲干擾,因此將彩碼的3種顏色色塊進(jìn)行圖像灰度化,通過cvtColor函數(shù)實(shí)現(xiàn)原圖→grayscale的轉(zhuǎn)換。圖7為彩碼灰度圖。

圖7 彩碼灰度圖

然后,將灰度圖轉(zhuǎn)換為binary二值圖[12],如圖8所示。

圖8 彩碼二值圖

下面將描述圖像的構(gòu)成。每張圖像的像素由R/G/B 3種顏色組成,每個(gè)分量值分別為0~255,組合共有256×256×256種顏色變化范圍。如果一個(gè)圖像像素的RGB為43、43、43,說明此時(shí)圖像是黑色的。如果圖像寬1 920,高1 080,那么這幅圖像就有1 920×1 080×3的數(shù)據(jù)。

圖像灰度化是將彩色圖像中的彩色信息剔除,只留下了亮度信息。因此,把RGB 3個(gè)分量轉(zhuǎn)成一個(gè)分量:3 channel→1 channel。如果將上述RGB圖片(43,43,43)轉(zhuǎn)換成grayscale灰度圖,那么就有1 920×1 080的數(shù)據(jù)。因?yàn)閷?duì)于灰度圖來說,每個(gè)像素上的點(diǎn)就一個(gè)值,為0~255中的一個(gè)數(shù)。值越小越黑,值越大越白。所以,一般先將彩色圖像轉(zhuǎn)化為灰度圖,以降低后續(xù)的圖像計(jì)算量。然而,灰度圖像仍然反映了彩碼圖像的整體以及局部色塊的色度和亮度等級(jí)的分布和特征。

此時(shí),再進(jìn)行圖像二值化。Binary的意思是非此即彼,非負(fù)即正。將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,即將整個(gè)圖像呈現(xiàn)出明顯的只有黑和白的視覺效果。當(dāng)把灰度圖轉(zhuǎn)換成二值圖時(shí),首先獲取每個(gè)pixel,之后將判斷grayscale的value是否大于某個(gè)值,假設(shè)為120。若這個(gè)值大于120,說明圖像偏白,因此設(shè)為255;如果小于120,就設(shè)為黑色0。這樣做是因?yàn)閷D片轉(zhuǎn)換成黑白后,能夠更加清晰地辨識(shí)每個(gè)色塊的邊緣輪廓。如果有雜點(diǎn),相比彩色圖片更易抗干擾。

對(duì)于彩碼雜點(diǎn)圖(如圖9所示),要找出正確色塊的連通域。因此,設(shè)計(jì)了彩碼圖像抗干擾算法。

圖9 彩碼雜點(diǎn)圖

算法思想:通過進(jìn)行色塊輪廓的遍歷,找出彩碼的有效色塊。尋找連通域時(shí),會(huì)把雜點(diǎn)也計(jì)算進(jìn)去,因此設(shè)置一個(gè)rule用來過濾一些不規(guī)則的色塊。具體步驟:(1)判斷這個(gè)contours的面積大小是否符合;(2)假如連通域面積與正常色塊相比太小或者太大,那么認(rèn)為這不是正確色塊;(3)如果contours的面積與正常色塊面積差不多,那么要根據(jù)它的形狀進(jìn)行判斷;(4)由于標(biāo)準(zhǔn)色塊的寬高比為1∶1,若contours的輪廓寬高比并不滿足1∶1,那么認(rèn)為此色塊為雜點(diǎn)。

算法基本思路如下:

輸入 area, sizeRate

定義 DEBUG=false

THRES_SIZE_MIN=100*100

THRES_SIZE_MAX=1000*1000

THRES_SIZE_RATE_MIN=0.618

THRES_SIZE_RATE_MAX=1.618

IF DEBUG或

(area>THRES_SIZE_MIN

且 area<THRES_SIZE_MAX

且 sizaRate>THRES_SIZE_RATE_MIN

且 sizaRate<THRES_SIZE_RATE_MAX)

為真

畫出輪廓

下面將正確色塊用綠色的邊框勾勒出來,其三原色 RGB為(50,255,80),并針對(duì) 24個(gè)contour找到它的中心。(rect.x,rect.y)表示每個(gè)色塊的左上角點(diǎn)的坐標(biāo)。rect.x往右加上寬的一半,是色塊中心點(diǎn)的橫坐標(biāo);rect.y往下加上高的一半,是色塊中心點(diǎn)的縱坐標(biāo)。同樣地,中心點(diǎn)為綠色(50,255,80),半徑是10。這里需注意,圖像具有一個(gè)特點(diǎn),即x從左往右逐漸變大,y值從上往下逐漸變大。如圖10所示,為圖像中的坐標(biāo)建立。

圖10 圖像中的坐標(biāo)建立

編碼過程中,calArray是最關(guān)鍵的函數(shù)。實(shí)現(xiàn)步驟:(1)上傳原圖,創(chuàng)建一個(gè)color代碼,寬和高為3行8列的數(shù)組;(2)findContours把矩形框全找出來;(3)find initial contours做一個(gè)初始化,如果邊框個(gè)數(shù)不是3行8列,說明這個(gè)彩碼有問題,那么屏幕顯示”the target number is not standard!(3*8)”;(4)如果檢測(cè)到的是正確的彩碼,那么根據(jù)色塊邊緣計(jì)算中心點(diǎn);(5)通過函數(shù)getSortedContourCenters()得到每一個(gè)Contour的中心點(diǎn)。

然而,雖然知道了每個(gè)中心點(diǎn)的坐標(biāo),但是這些點(diǎn)是無序排列的。圖11為中心點(diǎn)無序坐標(biāo)。因此,需要知曉8個(gè)點(diǎn)分別對(duì)應(yīng)的行數(shù)(第一、二、三行)以及從左往右的序列,而這需要采用聚類算法。

聚類算法如下。首先,需要區(qū)分出每一行的點(diǎn)。因?yàn)槊恳粋€(gè)色塊的排列位置有可能上下左右小范圍波動(dòng),所以在設(shè)計(jì)算法時(shí)也要考慮到這一點(diǎn)。例如,假設(shè)第一行有3個(gè)點(diǎn)分別為(100,120)(120,121)(140,119),第二行有3個(gè)點(diǎn)(100,160)(121,158)(139,162)……可以看出,盡管中心點(diǎn)橫坐標(biāo)和縱坐標(biāo)的排列上是有一定誤差的,但仍然可以進(jìn)行聚類——如y坐標(biāo),只會(huì)把相近數(shù)據(jù)歸為一行,而相差40上下的數(shù)據(jù)歸為兩行。

圖11 中心點(diǎn)無序坐標(biāo)

排序算法[13]:由于中心點(diǎn)是亂序的,所以要進(jìn)行排序算法。假設(shè)x、 y上下左右波動(dòng)容忍值THRES_ROW_DIS=20,遍歷所有中心點(diǎn)進(jìn)行從小到大y值排序和x排序。

輸入中心點(diǎn)坐標(biāo) o1,o2

if o2.y-o1.y>=THRES_ROW_DIS

return

o1.y,o2.y相對(duì)位置

else return

o1.x,02.x相對(duì)位置

排序完畢后,找出每個(gè)中心點(diǎn)對(duì)應(yīng)的色塊顏色,即getColorOfPoint()函數(shù),并返回相應(yīng)的編碼(紅色0,藍(lán)色1,黃色2)。

圖12是雜點(diǎn)彩碼計(jì)算輸出結(jié)果。

圖12 雜點(diǎn)彩碼計(jì)算輸出結(jié)果

3 結(jié) 語

本文提出了一種新型的掃碼標(biāo)簽——彩碼,通過中心點(diǎn)排序、色塊偏移矯正和雜點(diǎn)去除等多個(gè)算法,實(shí)現(xiàn)了對(duì)彩碼信息的讀取。可見,彩碼在未來商品世界中的廣泛應(yīng)用即將成為可能,如圖書的識(shí)別、產(chǎn)品的身份認(rèn)證、生產(chǎn)銷售的狀態(tài)等。然而,在彩碼的研究設(shè)計(jì)中還有諸多問題要解決,如識(shí)別的安全性能、識(shí)別的速度等,是下一步的研究重點(diǎn)。

[1] 許冬琦.彩碼識(shí)別技術(shù):所見即所得改變商業(yè)世界[J].通信世界,2012(13):25.XU Dong-qi.Color Code Recognition:What You See Is The Change in The Business World[J].Communications World,2012(13):25.

[2] 付金瑩,戴治城.一種創(chuàng)新型五色彩碼的設(shè)計(jì)與實(shí)現(xiàn)[J].中國新通信,2015(23):99-100.FU Jin-ying,DAI Zhi-cheng.Design and Implementation of an Innovative Color Code[J].New Communications,2015(23):99-100.

[3] 陳錦昌,王超然.彩碼再設(shè)計(jì)中降低色彩飽和度的研究[J].圖學(xué)學(xué)報(bào),2017,38(03):346-351.CHEN Jin-chang,WANG Chao-ran.The Research on Reduction of Saturation in Redesign of Color Code[J].Journal of Graphics,2017,38(03):346-351.

[4] 盛健,王晶晶,張毅群等.基于新型彩碼的信息生成、讀取和加密系統(tǒng)設(shè)計(jì)[J].科技創(chuàng)新與應(yīng)用,2015(25):66.SHENG Jian,WANG Jing-jing,ZHANG Yi-qun,et al.Design of Information Generation,Reading and Encryption System Based on New Color Code[J].Technology Innovation and Application,2015(25):66.

[5] 孫向華,趙雅英,馬小虎等.基于奇異值分解的三維彩碼零水印算法[J].電腦知識(shí)與技術(shù),2011,7(01):199-201.SUN Xiang-hua,ZHAO Ya-ying,MA Xiao-hu,et al.A Zero-Watermark Algorithm Based on SVD for Color Code Image[J].Computer Knowledge and Technology,2011,7(01):199-201.

[6] 李林森,王世祺,唐俊華等.基于彩色矩形碼的圖書管理方法及彩色矩形碼標(biāo)簽:中國,201611240151.X[P].2017-01-04.LI Lin-sen,WANG Shi-qi,TANG Jun-hua,et al.Book Management Method Based on Color Rectangle Code and Color Rectangle Code Lable:China,201611240151.X[P].2017-01-04.

[7] Gary Rost Bradski.學(xué)習(xí)opencv[M].北京:清華大學(xué)出版社,2009.Gary Rost Bradski.Learning Opencv[M].Beijin:Tsinghua University Press,2009.

[8] Robert Laganiere.OpenCV2計(jì)算機(jī)視覺編程手冊(cè)[M].北京:科學(xué)出版社,2013.Robert Laganiere.OpenCV2 Computer Visual Programming Manual[M].Beijin:China Science Publishing & Media Ltd,2013.

[9] 譚浩強(qiáng).C++程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2015.TAN Hao-qiang.C++ Program Design[M].Beijin:Tsinghua University Press,2015.

[10] 任玉剛.Android開發(fā)藝術(shù)探索[M].北京:電子工業(yè)出版社,2015.REN Yu-gang.Exploration of The Art of Development of Android[M].Beijin:Publishing House of Electronics Industry,2015.

[11] 何紅輝.Android開發(fā)進(jìn)階:從小工到專家[M].北京:人民郵電出版社,2016.HE Hong-hui.Android Advanced Development:From The Laborer to The Experts[M].Beijin:Posts & Telecom Press,2016.

[12] Bruce Eckel.Java編程思想[M].第4版.北京:機(jī)械工業(yè)出版社,2007.Bruce Eckel.Thinking in Java[M].Fourth Edition.Beijin:China Machine Press,2007.

[13] Damonare.十大經(jīng)典排序算法[DB/OL].(2016-09-19)[2017-10-20].http://web.jobbole.com/87968/.Damonare.Ten Classical Sorting Algorithms[DB/OL].(2016-09-19)[2017-10-20].http://web.jobbole.com/87968/.

猜你喜歡
排序方法
排排序
排序不等式
恐怖排序
學(xué)習(xí)方法
節(jié)日排序
刻舟求劍
兒童繪本(2018年5期)2018-04-12 16:45:32
用對(duì)方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 国产综合欧美| 天天干天天色综合网| 国产成人调教在线视频| 精品久久久久久成人AV| 亚洲国内精品自在自线官| 99热最新在线| 一区二区三区四区日韩| 亚洲三级色| 亚洲精品成人片在线观看| 欧美日韩国产在线人成app| 久久综合伊人77777| 欧美h在线观看| 国产在线一区视频| 有专无码视频| 乱码国产乱码精品精在线播放| 亚洲精品视频在线观看视频| 在线亚洲精品自拍| 女人18毛片久久| 激情爆乳一区二区| 草逼视频国产| 熟女日韩精品2区| 欧美日韩一区二区在线播放| 中文成人无码国产亚洲| 在线视频精品一区| 色偷偷一区| 国产一级做美女做受视频| 天天做天天爱天天爽综合区| 一本久道久综合久久鬼色| 国产精品视频999| 老司机午夜精品视频你懂的| 国产美女精品人人做人人爽| 免费播放毛片| 亚洲一区波多野结衣二区三区| 中文字幕在线视频免费| 国产一级在线播放| 色成人综合| 88av在线| 日韩免费视频播播| 永久免费无码日韩视频| 亚洲熟女偷拍| 国产成人精品18| 国产乱子伦精品视频| 欧美亚洲网| 婷婷午夜天| 亚洲国产天堂久久综合| 色噜噜狠狠狠综合曰曰曰| 九色视频线上播放| 奇米精品一区二区三区在线观看| 日韩免费毛片视频| 亚洲一区二区三区中文字幕5566| 久久国产精品夜色| 欧美色伊人| 日本爱爱精品一区二区| 久久人体视频| 亚洲一级毛片在线观播放| 久久情精品国产品免费| 国产精品亚洲一区二区三区z| 中文字幕第1页在线播| 亚洲三级a| 亚洲欧美另类日本| 成人夜夜嗨| 国产在线精彩视频论坛| 久草视频一区| 精品福利国产| 亚洲最大情网站在线观看| 黄片在线永久| 亚洲国产成人自拍| www亚洲天堂| 欧美成人午夜在线全部免费| 国产精品夜夜嗨视频免费视频| 国产中文在线亚洲精品官网| 视频一区视频二区日韩专区| 亚洲日本www| 亚洲视频三级| 亚洲第一视频网站| 青青久视频| 国产熟女一级毛片| 亚洲国产av无码综合原创国产| 国产91线观看| 99久久精品免费看国产电影| 色欲色欲久久综合网| 黄色福利在线|