本發明涉及二維碼識別技術領域,具體涉及一種用于圓柱面二維碼貼的預畸變二維碼生成方法。
背景技術:
目前,隨著二維碼編碼解碼技術的日益成熟,二維碼在日常生活中的應用日趨廣泛,媒體廣告、防偽標簽、名片社交、票證管理及電子支付等領域都以二維碼為傳播信息的載體來連通線上線下。
在較早期的技術中,二維碼的印刷和放置受到一定限制,需要將二維碼印制在平面或近似平面的印品上、或顯示在平面的終端顯示屏上,才能使得二維碼識讀設備能夠對其成功的解碼識別;識別時,由二維碼識讀設備通過攝像頭采集到的平面的二維碼圖像,由于攝像頭和二維碼標記之間的位置關系,通常存在傾斜畸變,因此在識別二維碼之前,需要要對圖像進行校正處理,例如采用hough變換、中心走勢線以及主方向檢測等方法進行校正后,得到校正的二維碼圖像進行解碼識別。
隨著二維碼應用技術的進步,目前,二維碼也開始逐漸應用在不同形狀物體的表面,例如:將二維碼印于圓柱形藥瓶、水杯等圓柱狀物體表面用于記錄相關信息;展會或促銷時,將包含產品信息或宣傳信息的二維碼貼紙貼在展銷人員的手臂上;等等。在這些應用場景下,因為二維碼都位于圓柱面或類圓柱面物體上,二維碼碼識讀設備拍攝到的二維碼圖像相較于平面的二維碼圖像而言存在一定的變形和失真,通用的二維碼識讀設備便無法直接對其進行解碼識別,需要專用的具備曲面校正運算處理能力的二維碼識讀設備才能對拍攝圖像進行畸變校正后正確的進行解碼識別。現有技術中,在解決二維碼識讀設備拍攝到的貼在圓柱面上的條碼的解碼上有較大的局限性。一方面是需要二維碼識讀設備具備曲面校正運算處理能力,二維碼識讀設備對位于圓柱面物體表面的二維碼解碼效率較低,另一方面是通常需要用戶手持具備曲面校正運算處理能力的二維碼識讀設備以不同角度捕獲條碼圖像,然后進行解碼嘗試,解碼成功率較低。
然而,如何能夠使得通用的二維碼識讀設備也能夠方便、快速、高效的解碼識別出圓柱面物體表面上的二維碼,成為了一個有待解決的問題。
技術實現要素:
針對現有技術中存在的不足,本發明的目的在于提供一種用于圓柱面二維碼貼的預畸變二維碼生成方法,用于將平面二維碼進行預畸變處理得到能夠抵消圓柱面拍攝透視畸變的預畸變二維碼,用于作為圓柱面二維碼貼,使得其貼設或印刷在圓柱面上之后,通過二維碼識讀設備對其直接拍攝獲得的二維碼圖像趨同于拍攝平面二維碼圖像的效果,從而使得通用的二維碼識讀設備也能夠方便、快速、高效的解碼識別出圓柱面物體表面上的二維碼,用以解決平面二維碼貼直接貼設或印刷在圓柱體上無法被識別或識別率低的問題。
為實現上述目的,本發明采用了如下技術方案:
一種用于圓柱面二維碼貼的預畸變二維碼生成方法,包括如下步驟:
1)獲得平面二維碼圖像,并獲得對象圓柱面的截面圓半徑r,預設拍攝俯仰角度θ;
2)建立平面坐標系,將平面二維碼圖像輸入至平面坐標系中,使得平面二維碼圖像的中心點與平面坐標系的原點相重合,從而獲得平面二維碼圖像中各像素點在平面坐標系中的像素坐標;
3)建立截面圓半徑為r的圓柱面坐標系,使得圓柱面坐標系與平面坐標系的原點和縱坐標軸相重合,并建立圓柱面坐標系與平面坐標系之間的投射方程:
其中,k為投射比例系數;x、y分別為平面坐標系的橫坐標值和縱坐標值;u、v分別為圓柱面坐標系的橫坐標值和縱坐標值;m11~m33為投射矩陣元素,構成圓柱面坐標系與平面坐標系之間的投射矩陣;
4)獲取平面二維碼圖像中除縱坐標軸上之外的四個像素點在平面坐標系中的像素坐標(xj,yj),j∈{1,2,3,4},按下式求出該四個像素坐標(xj,yj)投射在圓柱面坐標系中的對應像素坐標(uj,vj):
其中,π為圓周率;
5)將平面二維碼圖像中的四個像素點在平面坐標系中的像素坐標(xj,yj)與其投射在圓柱面坐標系中的對應像素坐標(uj,vj)的值作為輸入量分別代入到圓柱面坐標系與平面坐標系之間的投射方程中,j∈{1,2,3,4},對投射方程進行聯合求解,即求解出投射矩陣元素m11~m33的值,從而確定圓柱面坐標系與平面坐標系之間的投射矩陣;
6)設定投射比例系數k的取值,從而利用確定投射矩陣的圓柱面坐標系與平面坐標系之間的投射方程,根據平面二維碼圖像中各個像素點在平面坐標系中的像素坐標(xi,yi)計算確定其各自在圓柱面坐標系中的對應像素坐標(ui,vi),i∈{1,2,…,n},n表示平面二維碼圖像中包含的像素點總個數;
7)根據預設拍攝俯仰角度θ,對平面二維碼圖像中各個像素點在圓柱面坐標系中的對應像素坐標(ui,vi)進行俯仰角度拉伸變換:
u′i=ui,v′i=viarccosθ,i∈{1,2,…,n};
(u′i,v′i)表示平面二維碼圖像中各個像素點在圓柱面坐標系中的對應像素坐標(ui,vi)進行俯仰角度拉伸變換后的像素坐標值,i∈{1,2,…,n};
8)對平面二維碼圖像按照步驟7)所得的俯仰角度拉伸變換后的像素坐標值(ui′,vi′)進行平面拉伸,i∈{1,2,…,n},得到平面二維碼圖像用于對象圓柱面二維碼貼所對應的預畸變二維碼圖像。
上述用于圓柱面二維碼貼的預畸變二維碼生成方法中,作為優選方案,所述步驟4)中,優選獲取平面二維碼圖像中的四個角像素點在平面坐標系中的像素坐標用以求取投射在圓柱面坐標系中的對應像素坐標。
相比于現有技術,本發明具有如下有益效果:
本發明用于圓柱面二維碼貼的預畸變二維碼生成方法,其通過將平面二維碼圖像進行預畸變處理,得到對應的預畸變二維碼圖像,可用于打印成為二維碼貼貼附于對象圓柱面上,或者直接印刷在對象圓柱面上,在預設的拍攝俯仰角度θ附近采用二維碼識讀設備對其直接進行拍攝,由于預畸變二維碼能夠抵消對圓柱面拍攝的透視畸變,使得二維碼識讀設備對其直接拍攝獲得的二維碼圖像趨同于拍攝平面二維碼圖像的效果,從而使得通用的二維碼識讀設備也能夠方便、快速、高效的解碼識別出圓柱面物體表面上的二維碼,解決了平面二維碼貼直接貼設或印刷在圓柱體上無法被識別或識別率低的問題。
附圖說明
圖1為一個平面二維碼貼的原始圖像。
圖2為圖1所示平面二維碼貼貼設于圓柱形杯子外側面上的拍攝效果圖。
圖3為對圖2所示杯子外側面上的二維碼進行畸變校正后得到二維碼圖像。
圖4為平面二維碼上的一點p的位置示意圖。
圖5為圖4所示平面二維碼上的一點p貼設在圓柱面上后的位置及其投射到平面上的投射位置關系示意圖。
圖6為θ度平面與0度平面之間的投射位置關系示意圖。
圖7為將圖1所示平面二維碼按照本發明方法處理得到的對應預畸變二維碼圖像。
圖8為圖7所示預畸變二維碼圖像貼設于圓柱形杯子外側面上的拍攝效果圖。
具體實施方式
本發明提出了一種用于圓柱面二維碼貼的預畸變二維碼生成方法,目的是使得平面二維碼進行預畸變處理后得到的預畸變二維碼貼設或印刷在圓柱面上之后,對其直接拍攝獲得的二維碼圖像能夠趨同于拍攝平面二維碼圖像的效果。要解決這一問題,需要解決透視和圓柱面畸變兩個層面的問題。
現實生活中的景物,由于觀察距離及方位不同在視覺上會引起不同的反映,這種現象就是透視現象。
1.透視變換的基本原理:
將z軸作為導出視點所在坐標軸,并且取與此軸垂直的坐標平面為畫面的透視投影公式。設視點e(0,0,ze)在z軸上,空間點為s(xs,ys,zs),則視線es的直線方程為:
此直線和畫面z=0相交時的參數為t=-ze/(z1-ze),將此參數t代入式(1)前面兩個式子,并把變換式應用于三個坐標,且由于s是空間的任意一點,取消足坐標并用齊次坐標寫出,式(1)的變換即是:
矩陣:
叫做視點在z軸上的透視變換陣。同理,視點在x軸上和y軸上的變換陣,分別為:
2.二維碼預畸變實現方案:
根據透視變換理論,在使用線性攝像頭拍攝二維碼的場景中,可以使用3×4的矩陣來建模從世界坐標[5]到圖像坐標的變換,用下述等式(5)描述。
其中,u和v代表一個點在圖像平面中的坐標值;(x,y,z)描述了這個點在世界坐標系中的位置;k為比例系數,m11~m34構成攝影矩陣。
以圓柱形畸變為例,將如圖1所示的平面二維碼貼帖于圓柱形杯子的外側面上,貼設效果如圖2所示。圓柱形杯子直徑為6cm,二維碼尺寸為6×6cm,此時由于二維碼的尺寸和圓柱的半徑相當,圓柱瓶身所導致的畸變使得二維碼無法識別。
(1)求解攝影矩陣:
由等式(5)世界坐標系到圖像平面坐標系的變換,消去k,可以得到等式(6)所描述的關系。由等式(6)可知,方程中有12個未知數,對于矩陣來說只有11個自由度,可以令m34=1,從而求出攝影矩陣。因此需要6個點在兩個坐標系中的對應位置(xi,yi)和(ui,vi),就可以解出攝影矩陣m11~m33。
(2)驗證攝影矩陣:
出攝影矩陣后,為了驗證該矩陣的正確性,將圖2中畸變二維碼通過攝影矩陣正向解碼。掃描三維世界坐標系中的二維碼坐標信息,通過攝影矩陣尋找各個點在圖像中對應的灰度值,最終生成二維平面下的經過矯正的二維碼,如圖3所示,可以看出,二維碼恢復的效果不錯,將經過矯正的二維碼(圖3)與原始的平面二維碼(圖1)進行對比計算,得知矯正二維碼的錯誤率僅為0.74%,因此可以判定攝影矩陣的求解是正確的。
(3)二維碼預畸變:
在已知攝影矩陣的情況下,進行逆向預畸變。這里根據拍攝俯仰角度的不同分兩種情況討論。
a、當拍攝俯仰角度為0°的情況。
當拍攝俯仰角度為0°的時候,可以先將二維碼映射到和二維碼曲面相切的0°平面上。此時,對于這個平面,式(5)中的z軸坐標全為0,故可簡化為式(7):
則式(6)相應的可以化簡為式(8):
通過上文介紹的方法,此時只要得到4個點在兩個坐標系中的對應位置(xi,yi)和(ui,vi)便可以求出攝影矩陣m11~m32。下面介紹這4個點在坐標系中的對應位置的求解方法。
對于圓柱形,在預畸變時只需要在x軸一個方向上進行拉伸即可。設平面二維碼上的一點p,坐標為(x,y),如圖4所示;若將該平面二維碼貼設在圓柱面上,取包含p點的圓柱橫截面,如圖5所示。該橫截面是一個半徑為r的圓,由于圓柱曲面導致二維碼產生畸變,在此將p點映射到平面上一點(x,y),即
即可得出l1,l2的關系:
預畸變的坐標關系為:
通過式(12)的關系,即可找出4個點在兩個坐標系中的對應位置(xi,yi)和(ui,vi),通常選取二維碼的如四個角點,接著就可以求出攝影矩陣m11~m32。對攝影矩陣進行逆向畸變,即只需要將每個點按上述關系進行拉伸,則當二維碼貼于圓柱面時,由于圓柱面的視覺壓縮,此時二維碼就會呈現等同于貼在水平面上的效果。
b、當拍攝俯仰角度不為0°的情況。
當拍攝俯仰角度不為0°時,需要進行兩次坐標映射。
(1)首先,設二維碼掃描識別設備的拍攝俯仰角度為θ,對于這種情況,可以近似等價于如6所示。圖6中,θ度平面是標準二維碼成像所在的平面,首先將θ度平面的二維碼坐標映射到0度平面,考慮二維碼上任意一點p,其坐標為(x,y),p1的坐標為(x1,y1)。分別過p、p1做垂直與x軸的垂線并相交于o,則可以推導出坐標映射關系為:
y1=yarccosθ;(13)
同理,按照此方法可以求出標準二維碼映射到0度平面之后四個頂點的坐標。然后,通過已知的四個點,按照拍攝俯仰角度為0時的方法,即可求出對應的0度平面預畸變二維碼。
(2)接著,通過第一次映射得到的0度平面的二維碼的四個頂點與圓柱體的直徑,可以求出最后貼于圓柱體的二維碼四個頂點映射到0度平面后的坐標。最后再根據0度平面二維碼的四個頂點與曲面映射到0度平面時的四個頂點的坐標,通過空間投影傾斜校正逆向求解的方法得到最終需要的預畸變的二維碼。
由此,本發明用于圓柱面二維碼貼的預畸變二維碼生成方法,其整體處理流程包括如下步驟:
1)獲得平面二維碼圖像,并獲得對象圓柱面的截面圓半徑r,預設拍攝俯仰角度θ。
2)建立平面坐標系,將平面二維碼圖像輸入至平面坐標系中,使得平面二維碼圖像的中心點與平面坐標系的原點相重合,從而獲得平面二維碼圖像中各像素點在平面坐標系中的像素坐標。
3)建立截面圓半徑為r的圓柱面坐標系,使得圓柱面坐標系與平面坐標系的原點和縱坐標軸相重合,并建立圓柱面坐標系與平面坐標系之間的投射方程:
其中,k為投射比例系數;x、y分別為平面坐標系的橫坐標值和縱坐標值;u、v分別為圓柱面坐標系的橫坐標值和縱坐標值;m11~m33為投射矩陣元素,構成圓柱面坐標系與平面坐標系之間的投射矩陣。
4)獲取平面二維碼圖像中除縱坐標軸上之外的四個像素點在平面坐標系中的像素坐標(xj,yj),j∈{1,2,3,4};這里可以優選采用平面二維碼的四個角像素點,因為平面二維碼的四個角像素點在平面坐標系中的坐標位置相差較大,有利于充分體現兩個坐標之間的投射關系,同時,由于平面坐標系與圓柱面坐標系的縱坐標軸相重合,無法用于體現兩個坐標之間的投射關系,因此應當排除使用縱坐標軸上的像素點;然后,按下式求出該四個像素坐標(xj,yj)投射在圓柱面坐標系中的對應像素坐標(uj,vj):
其中,π為圓周率。
5)將平面二維碼圖像中的四個像素點在平面坐標系中的像素坐標(xj,yj)與其投射在圓柱面坐標系中的對應像素坐標(uj,vj)的值作為輸入量分別代入到圓柱面坐標系與平面坐標系之間的投射方程中,j∈{1,2,3,4},對投射方程進行聯合求解,即求解出投射矩陣元素m11~m33的值,從而確定圓柱面坐標系與平面坐標系之間的投射矩陣。
6)設定投射比例系數k的取值,從而利用確定投射矩陣的圓柱面坐標系與平面坐標系之間的投射方程,根據平面二維碼圖像中各個像素點在平面坐標系中的像素坐標(xi,yi)計算確定其各自在圓柱面坐標系中的對應像素坐標(ui,vi),i∈{1,2,…,n},n表示平面二維碼圖像中包含的像素點總個數。
7)根據預設拍攝俯仰角度θ,對平面二維碼圖像中各個像素點在圓柱面坐標系中的對應像素坐標(ui,vi)進行俯仰角度拉伸變換:
u′i=ui,v′i=viarccosθ,i∈{1,2,…,n};
(u′i,v′i)表示平面二維碼圖像中各個像素點在圓柱面坐標系中的對應像素坐標(ui,vi)進行俯仰角度拉伸變換后的像素坐標值,i∈{1,2,…,n}。
8)對平面二維碼圖像按照步驟7)所得的俯仰角度拉伸變換后的像素坐標值(u′i,v′i)進行平面拉伸,i∈{1,2,…,n},得到平面二維碼圖像用于對象圓柱面二維碼貼所對應的預畸變二維碼圖像。
針對圖1所示的平面二維碼,在對象圓柱面的截面圓半徑r為3cm、預設拍攝俯仰角度θ為0°的條件下,按照本發明方法處理得到的對應預畸變二維碼圖像如圖7所示,將該預畸變二維碼圖像進行平面打印為二維碼貼貼設與截面圓半徑為3cm(直徑為6cm)的圓柱形杯子外側面上,從0°的拍攝俯仰角度進行拍攝所得的圖像如圖8所示。可以看到,通過本發明方法將平面二維碼圖像處理得到的預畸變二維碼圖像,可用于打印成為二維碼貼貼附于對象圓柱面上,或者直接印刷在對象圓柱面上,在預設的拍攝俯仰角度θ附近采用二維碼識讀設備對其直接進行拍攝,由于預畸變二維碼能夠抵消對圓柱面拍攝的透視畸變,使得二維碼識讀設備對其直接拍攝獲得的二維碼圖像趨同于拍攝平面二維碼圖像的效果,從而使得通用的二維碼識讀設備也能夠方便、快速、高效的解碼識別出圓柱面物體表面上的二維碼,解決了平面二維碼貼直接貼設或印刷在圓柱體上無法被識別或識別率低的問題。
但是,本發明二維碼預畸變處理方案還存在一些局限性:
1.本發明方案能夠實現一個拍攝俯仰角度θ的二維碼預畸變,并且使用二維碼識讀設備在預設的拍攝俯仰角度θ附近進行拍攝掃描,都能夠正確的解碼識別出二維碼信息,但對于任意拍攝掃描角度的掃描識別,本發明方案暫時無法滿足。
2.如果實際圓柱體的橫截面半徑與預畸變處理中的圓柱體的橫截面半徑值不相一致或者存在偏差,會使得采用本發明方法得到的預畸變二維碼圖像存在誤差,可能會導致通用二維碼識讀設備對其掃描識別失敗。
雖然本方案還存在以上問題,但是對于滿足特定應用場景的條件下,本發明方法處理得到的預畸變二維碼作為圓柱面二維碼貼貼設或印刷在圓柱面上之后,能夠使得直接拍攝獲得的二維碼圖像趨同于拍攝平面二維碼圖像的效果,從而使得通用的二維碼識讀設備也能夠方便、快速、高效的解碼識別出圓柱面物體表面上的二維碼,可以滿足正常的使用需求。上述兩方面的技術問題,可在后續的研究中進行分析解決。
最后說明的是,以上實施例僅用以說明本發明的技術方案而非限制,盡管參照較佳實施例對本發明進行了詳細說明,本領域的普通技術人員應當理解,可以對本發明的技術方案進行修改或者等同替換,而不脫離本發明技術方案的宗旨和范圍,其均應涵蓋在本發明的權利要求范圍當中。