主权项 |
一种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>∫</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>Σ</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>Δ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>Δ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>Σ</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Σ</mi><msub><mi>X</mi><mi>i</mi></msub><mo>+</mo><mi>bΣ</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Σ</mi><msup><mi>X</mi><mn>2</mn></msup><mo>-</mo><mi>ΣXΣ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ΣXY</mi><mo>-</mo><mi>ΣXΣY</mi><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>G</mi><mn>22</mn></msub><mo>=</mo><mi>NΣ</mi><msup><mi>X</mi><mn>3</mn></msup><mo>+</mo><mi>ΣXY</mi><mo>-</mo><mi>Σ</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>ΣX</mi></mtd></mtr><mtr><mtd><msub><mi>E</mi><mn>1</mn></msub><mo>=</mo><mrow><mo>(</mo><mi>XΣ</mi><msup><mi>Y</mi><mn>2</mn></msup><mo>-</mo><mi>ΣYΣY</mi><mo>)</mo></mrow></mtd></mtr><mtr><mtd><msub><mi>E</mi><mn>2</mn></msub><mo>=</mo><mi>NΣ</mi><msup><mi>X</mi><mn>2</mn></msup><mi>Y</mi><mo>+</mo><mi>NΣ</mi><msup><mi>Y</mi><mn>3</mn></msup><mo>-</mo><mi>Σ</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>Σ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>求出的圆心和半径为圆标志的精确的圆心定位参数和半径参数,达到亚像素级。 |