发明名称 一种PCB视觉检测中快速圆形标志定位方法
摘要 本发明基于点Hough变换与Legendre矩的圆亚像素检测算法,提供一种PCB视觉检测中快速圆形标志定位方法,运用Canny算子进行边缘检测和点Hough变换得出圆标志像素级参数值,再利用圆标志像素级参数值滤除边缘点中噪声点,接着对基于Legendre正交矩的亚像素边缘定位方法和误差进行分析,利用Legendre正交矩和误差方法对滤除噪声点后的边缘点进行亚像素求值,最后再用快速最小二乘法对边缘点进行拟合得到圆的精确的圆心定位参数和半径参数。该方法保留了点Hough变换运算速度快的特点,而且定位精度高,抗噪能力强,具有准确性、快速性和鲁棒性的特点,满足了PCB视觉检测中的高精度和实时性的要求。
申请公布号 CN102034101B 申请公布日期 2014.11.05
申请号 CN201010518481.7 申请日期 2010.10.22
申请人 广东工业大学 发明人 程良伦;任斌
分类号 G06K9/32(2006.01)I;G06K9/46(2006.01)I 主分类号 G06K9/32(2006.01)I
代理机构 广州粤高专利商标代理有限公司 44102 代理人 林丽明
主权项 一种PCB视觉检测中快速圆形标志定位方法,包括以下步骤:步骤一,对PCB图像的圆形标志利用Canny算子进行边缘检测,把边缘点进行边缘跟踪排序,存入数组中,然后把这些点分为三等份,每次分别从这三部分中各取出一点,构成点组进行计算;步骤二,根据以下公式进行计算求出圆的参数,多次参数向量出现频率最高的即为检测圆的参数;<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mi>O</mi><mi>x</mi></msub><mo>=</mo><mfrac><mrow><msub><mi>K</mi><mi>OA</mi></msub><msub><mi>A</mi><mi>X</mi></msub><mo>-</mo><mi>Ay</mi><mo>-</mo><msub><mi>K</mi><mi>OB</mi></msub><msub><mi>B</mi><mi>x</mi></msub><mo>+</mo><msub><mi>B</mi><mi>y</mi></msub></mrow><mrow><msub><mi>K</mi><mi>OA</mi></msub><mo>-</mo><msub><mi>K</mi><mi>OB</mi></msub></mrow></mfrac></mrow>]]></math><img file="FDA0000528860500000011.GIF" wi="686" he="144" /></maths>O<sub>y</sub>=K<sub>OA</sub>(O<sub>x</sub>‑A<sub>x</sub>)+A<sub>y</sub><maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mi>R</mi><mo>=</mo><msqrt><msup><mrow><mo>(</mo><msub><mi>O</mi><mi>x</mi></msub><mo>-</mo><msub><mi>K</mi><mi>x</mi></msub><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><msub><mi>Q</mi><mi>y</mi></msub><mo>-</mo><msub><mi>K</mi><mi>y</mi></msub><mo>)</mo></mrow><mn>2</mn></msup></msqrt></mrow>]]></math><img file="FDA0000528860500000012.GIF" wi="652" he="100" /></maths>上述公式中,O<sub>x</sub>,O<sub>y</sub>,R分别为圆心的X轴坐标、Y轴坐标和圆的半径;设K,N,J为被测圆边缘上3点,构成不平行的2条弦KN和NJ,则弦KN和NJ的中垂线OA,OB必交于圆心O点,K,N,J,点的坐标分别为(K<sub>x</sub>,K<sub>y</sub>),(N<sub>x</sub>,N<sub>y</sub>),(J<sub>x</sub>,J<sub>y</sub>),K<sub>OA</sub>,K<sub>OB</sub>分别为直线OA、直线OB的斜率,则A,B点的坐标为:A<sub>x</sub>=(K<sub>x</sub>+N<sub>x</sub>)/2A<sub>y</sub>=(K<sub>y</sub>+N<sub>y</sub>)/2B<sub>x</sub>=(N<sub>x</sub>+J<sub>x</sub>)/2B<sub>y</sub>=(N<sub>y</sub>+J<sub>y</sub>)/2则OA,OB的直线方程为:L<sub>OA</sub>:<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><mi>y</mi><mo>=</mo><mfrac><mrow><msub><mi>K</mi><mi>x</mi></msub><mo>-</mo><msub><mi>N</mi><mi>x</mi></msub></mrow><mrow><msub><mi>N</mi><mi>y</mi></msub><mo>-</mo><msub><mi>K</mi><mi>y</mi></msub></mrow></mfrac><mrow><mo>(</mo><mi>x</mi><mo>-</mo><msub><mi>A</mi><mi>x</mi></msub><mo>)</mo></mrow><mo>+</mo><msub><mi>A</mi><mi>y</mi></msub></mrow>]]></math><img file="FDA0000528860500000013.GIF" wi="552" he="144" /></maths>L<sub>OB</sub>:<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><mi>y</mi><mo>=</mo><mfrac><mrow><mi>Jx</mi><mo>-</mo><mi>Nx</mi></mrow><mrow><mi>Ny</mi><mo>-</mo><mi>Jy</mi></mrow></mfrac><mrow><mo>(</mo><mi>x</mi><mo>-</mo><mi>Bx</mi><mo>)</mo></mrow><mo>+</mo><mi>By</mi></mrow>]]></math><img file="FDA0000528860500000014.GIF" wi="538" he="140" /></maths>步骤三,滤除边缘噪声点.对于边缘检测后的边缘点,运用已经得到的圆的参数进行检测,滤除大的噪声点,假设边缘检测后任一可能边缘点的坐标为T(T<sub>x</sub>,T<sub>y</sub>),到圆心O的距离为:<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><mi>d</mi><mo>=</mo><msqrt><msup><mrow><mo>(</mo><msub><mi>T</mi><mi>x</mi></msub><mo>-</mo><msub><mi>O</mi><mi>x</mi></msub><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><msub><mi>T</mi><mi>y</mi></msub><mo>-</mo><msub><mi>O</mi><mi>y</mi></msub><mo>)</mo></mrow><mn>2</mn></msup></msqrt></mrow>]]></math><img file="FDA0000528860500000015.GIF" wi="621" he="105" /></maths>则:<img file="FDA0000528860500000016.GIF" wi="569" he="168" />其中E为滤除噪声点的阀值,取2个像素,对所有候选边缘点按上式比较运算,即可滤除非边缘点,把被检测圆上的边缘点保留下来;步骤四,对各边缘点进行一维亚像素边缘检测,把宽度为10个像素的窗口,拉伸坐标到[‑1,1]区间内,G(i)为各个位置像素的区域,G(i)分别为[‑1,‑0.8],[‑0.8,‑0.6],[‑0.6,‑0.4],[‑0.4,‑0.2],[‑0.2,0],[0,0.2],[0.2,0.4],[0.4,0.6],[0.6,0.8]和[0.8,1],根据式<maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><msub><mi>C</mi><mi>p</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><mfrac><mrow><mo>(</mo><mn>2</mn><mi>p</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mn>2</mn></mfrac><munder><mo>&Integral;</mo><mrow><mi>G</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></mrow></munder><msub><mi>P</mi><mi>p</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi></mrow>]]></math><img file="FDA0000528860500000021.GIF" wi="570" he="144" /></maths>可得到前三阶的C<sub>0</sub>、C<sub>1</sub>和C<sub>2</sub>,把系数值和各边缘点的参数代入式<maths num="0007" id="cmaths0007"><math><![CDATA[<mrow><msub><mover><mi>L</mi><mo>~</mo></mover><mi>p</mi></msub><mo>=</mo><munder><mi>&Sigma;</mi><mi>i</mi></munder><mi>D</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><msub><mi>C</mi><mi>p</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mrow>]]></math><img file="FDA0000528860500000022.GIF" wi="414" he="126" /></maths>分别算出边缘点的各阶矩;步骤五,根据下式:<maths num="0008" id="cmaths0008"><math><![CDATA[<mrow><mi>l</mi><mo>=</mo><mfrac><mrow><mn>3</mn><msub><mover><mi>L</mi><mo>~</mo></mover><mn>2</mn></msub></mrow><msub><mover><mi>L</mi><mo>~</mo></mover><mn>1</mn></msub></mfrac></mrow>]]></math><img file="FDA0000528860500000023.GIF" wi="178" he="174" /></maths><maths num="0009" id="cmaths0009"><math><![CDATA[<mrow><mi>k</mi><mo>=</mo><mfrac><mrow><mn>4</mn><msub><mover><mi>L</mi><mo>~</mo></mover><mn>1</mn></msub></mrow><mrow><mn>3</mn><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msup><mi>l</mi><mn>2</mn></msup><mo>)</mo></mrow></mrow></mfrac></mrow>]]></math><img file="FDA0000528860500000024.GIF" wi="276" he="162" /></maths><maths num="0010" id="cmaths0010"><math><![CDATA[<mrow><mi>h</mi><mo>=</mo><msub><mover><mi>L</mi><mo>~</mo></mover><mn>0</mn></msub><mo>-</mo><mfrac><mi>k</mi><mn>2</mn></mfrac><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>l</mi><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000528860500000025.GIF" wi="353" he="127" /></maths>及各阶矩的参数分别求出各边缘点的l,k,h组;步骤六,原理误差和实边缘的位置的求取,根据下式:<maths num="0011" id="cmaths0011"><math><![CDATA[<mrow><mi>B</mi><mrow><mo>(</mo><msub><mi>l</mi><mn>1</mn></msub><mo>,</mo><msub><mi>l</mi><mn>2</mn></msub><mo>,</mo><mi>l</mi><mo>)</mo></mrow><mo>=</mo><mi>l</mi><mo>-</mo><mfrac><mrow><mi>&Delta;k</mi><mo>[</mo><msub><mi>l</mi><mn>1</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup><mo>)</mo></mrow><mo>-</mo><msub><mi>l</mi><mn>2</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>)</mo></mrow><mo>]</mo><mo>+</mo><mi>k</mi><msub><mi>l</mi><mn>2</mn></msub><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>)</mo></mrow></mrow><mrow><mi>&Delta;k</mi><mrow><mo>(</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>-</mo><msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup><mo>)</mo></mrow><mo>+</mo><mi>k</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>)</mo></mrow></mrow></mfrac><mo>=</mo><mfrac><mrow><mrow><mo>(</mo><mi>l</mi><mo>-</mo><msub><mi>l</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><msub><mi>l</mi><mn>2</mn></msub><mo>-</mo><mi>l</mi><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>-</mo><msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup><mo>)</mo></mrow></mrow><mrow><mrow><mo>(</mo><msub><mi>l</mi><mn>2</mn></msub><mo>-</mo><mi>l</mi><mo>)</mo></mrow><mrow><mo>(</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>-</mo><msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup><mo>)</mo></mrow><mo>+</mo><mrow><mo>(</mo><msub><mi>l</mi><mn>2</mn></msub><mo>-</mo><msub><mi>l</mi><mn>1</mn></msub><mo>)</mo></mrow><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msubsup><mi>l</mi><mn>2</mn><mn>2</mn></msubsup><mo>)</mo></mrow></mrow></mfrac></mrow>]]></math><img file="FDA0000528860500000026.GIF" wi="1741" he="155" /></maths>求出原理误差B(l),再加上步骤四中用Legendre矩方法求得的边缘位置l就为真实边缘的位置;步骤七,对于被检测的边缘点(x<sub>1</sub>,y<sub>1</sub>),(x<sub>2</sub>,y<sub>2</sub>),…,(x<sub>N</sub>,y<sub>N</sub>),以之对圆其进行拟合就可得到圆的精确的圆心定位参数和半径参数,其中取N个拟合点,X(x<sub>1</sub>,x<sub>2</sub>,...,x<sub>N</sub>)以及Y(y<sub>1</sub>,y<sub>2</sub>,...,y<sub>N</sub>)为各坐标分量组成的向量,根据式:<maths num="0012" id="cmaths0012"><math><![CDATA[<mfenced open='{' close=''><mtable><mtr><mtd><mi>a</mi><mo>=</mo><mfrac><mrow><msub><mi>G</mi><mn>22</mn></msub><msub><mi>E</mi><mn>1</mn></msub><mo>-</mo><msub><mi>G</mi><mn>12</mn></msub><msub><mi>E</mi><mn>2</mn></msub></mrow><mrow><msub><mi>G</mi><mn>11</mn></msub><msub><mi>G</mi><mn>22</mn></msub><mo>-</mo><msub><mi>G</mi><mn>12</mn></msub><msub><mi>G</mi><mn>21</mn></msub></mrow></mfrac></mtd></mtr><mtr><mtd><mi>b</mi><mo>=</mo><mfrac><mrow><msub><mi>G</mi><mn>11</mn></msub><msub><mi>E</mi><mn>2</mn></msub><mo>-</mo><msub><mi>G</mi><mn>21</mn></msub><msub><mi>E</mi><mn>1</mn></msub></mrow><mrow><msub><mi>G</mi><mn>11</mn></msub><msub><mi>G</mi><mn>22</mn></msub><mo>-</mo><msub><mi>G</mi><mn>12</mn></msub><msub><mi>G</mi><mn>21</mn></msub></mrow></mfrac></mtd></mtr><mtr><mtd><mi>c</mi><mo>=</mo><mo>-</mo><mfrac><mrow><mi>&Sigma;</mi><mrow><mo>(</mo><msubsup><mi>X</mi><mi>i</mi><mn>2</mn></msubsup><mo>+</mo><msup><msub><mi>Y</mi><mi>i</mi></msub><mn>2</mn></msup><mo>)</mo></mrow><mo>+</mo><mi>a&Sigma;</mi><msub><mi>X</mi><mi>i</mi></msub><mo>+</mo><mi>b&Sigma;</mi><msub><mi>Y</mi><mi>i</mi></msub></mrow><mi>N</mi></mfrac></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000528860500000027.GIF" wi="760" he="386" /></maths>求出中间参数a,b,c,其中:<maths num="0013" id="cmaths0013"><math><![CDATA[<mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>G</mi><mn>11</mn></msub><mo>=</mo><mrow><mo>(</mo><mi>N&Sigma;</mi><msup><mi>X</mi><mn>2</mn></msup><mo>-</mo><mi>&Sigma;X&Sigma;X</mi><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>G</mi><mn>12</mn></msub><mo>=</mo><msub><mi>G</mi><mn>21</mn></msub><mo>=</mo><mrow><mo>(</mo><mi>N&Sigma;XY</mi><mo>-</mo><mi>&Sigma;X&Sigma;Y</mi><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>G</mi><mn>22</mn></msub><mo>=</mo><mi>N&Sigma;</mi><msup><mi>X</mi><mn>3</mn></msup><mo>+</mo><mi>&Sigma;XY</mi><mo>-</mo><mi>&Sigma;</mi><mrow><mo>(</mo><msup><mi>X</mi><mn>2</mn></msup><mo>+</mo><msup><mi>Y</mi><mn>2</mn></msup><mo>)</mo></mrow><mi>&Sigma;X</mi></mtd></mtr><mtr><mtd><msub><mi>E</mi><mn>1</mn></msub><mo>=</mo><mrow><mo>(</mo><mi>X&Sigma;</mi><msup><mi>Y</mi><mn>2</mn></msup><mo>-</mo><mi>&Sigma;Y&Sigma;Y</mi><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>E</mi><mn>2</mn></msub><mo>=</mo><mi>N&Sigma;</mi><msup><mi>X</mi><mn>2</mn></msup><mi>Y</mi><mo>+</mo><mi>N&Sigma;</mi><msup><mi>Y</mi><mn>3</mn></msup><mo>-</mo><mi>&Sigma;</mi><mrow><mo>(</mo><msup><mi>X</mi><mn>2</mn></msup><mo>+</mo><msup><mi>Y</mi><mn>2</mn></msup><mo>)</mo></mrow><mi>&Sigma;Y</mi></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000528860500000028.GIF" wi="759" he="386" /></maths>把中间参数a,b,c代入下式可得到圆的精确的圆心定位参数和半径参数,<maths num="0014" id="cmaths0014"><math><![CDATA[<mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>x</mi><mn>0</mn></msub><mo>=</mo><mfrac><mi>a</mi><mrow><mo>-</mo><mn>2</mn></mrow></mfrac></mtd></mtr><mtr><mtd><msub><mi>y</mi><mn>0</mn></msub><mo>=</mo><mfrac><mi>b</mi><mrow><mo>-</mo><mn>2</mn></mrow></mfrac></mtd></mtr><mtr><mtd><mi>R</mi><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><msqrt><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup><mo>-</mo><mn>4</mn><mi>c</mi></msqrt></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000528860500000029.GIF" wi="442" he="356" /></maths>求出的圆心和半径为圆标志的精确的圆心定位参数和半径参数,达到亚像素级。
地址 510006 广东省广州市番禺区广州大学城外环西路100号