项目实战 五 拟合直线 获得中线
生活随笔
收集整理的這篇文章主要介紹了
项目实战 五 拟合直线 获得中线
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡介
? ? ? ? 項目中常見的最常見的擬合一般多是擬合直線和擬合圓,但是我個人最初在自學halcon 的時候總是一看到類似直線的東西就直接擬合,一看到類似圓的東西就直接擬合圓,但是我們在做項目的時候要有很多的禁忌,要考慮到很多的東西,所以要讓算法有更強的兼容性,下面我們來一起看一這個擬合直線如何擬合:
1、傳入一張圖片,和一個ROI
2、使用二維卡尺找出擬合直線的點(這一步很重要)
3、從第二步的點來擬合圓,但是我們會設點一個點到直線的最小距離,用這個距離來判斷直線的擬合優越性,刪除掉一些到跳點,防止一些個別點導致擬合直線不理想的問題
4、輸出
從上面我們可以得到一條 或者多條直線,那如果是求出兩條直線的中線,如何來求呢?
1 、首先傳入兩條中線
2、判斷這兩天直線的角度以及這兩天直線是不是相交
3、如果相交,求直線上(線段的端點)在另外一條直線上的投影點,直接取中點,同理求另外一個端點的投影,求中點,連起來就是中線
4、如果有相交,那么這個就比較復雜點,首先我們要計算兩個端點(直線出入的端點)到2 中計算得出的點到點的距離d1 d2
5、然后以2中的交點(假設r,c)r,c,d1 以及r,c,d2畫圓,然后計算另外一條直線與這兩個圓之間的交點
6、上圖中的兩個端點就是我們最想要的兩個點?
7、最后輸出
二、擬合直線
核心代碼:?
* 使用二維測量來找點create_metrology_model (MetrologyHandle)*設置句柄模型的大小set_metrology_model_image_size (MetrologyHandle, Width, Height)add_metrology_object_generic (MetrologyHandle, 'line', [Row1,Col1,Row2,Col2], Len2[Len2Index], RectWidth[RectWidthIndex], Sigma[SigmaIndex], Threshold[ThresholdIndex], [], [], temp)* 設置參數set_metrology_object_param (MetrologyHandle, 'all', ['measure_transition','num_measures','measure_select'], [Transtion[TransitionIndex], Count[CountIndex], Select[SelectIndex]])* set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', Select[SelectIndex]) *使用參數apply_metrology_model (Image, MetrologyHandle)* 得到結果get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Rows, Columns)gen_cross_contour_xld (Cross1, Rows, Columns, 6, 0.78)clear_metrology_model (MetrologyHandle)*擬合直線fit_line_contour_xld (Contour, 'drop', -1, 0, 5, 2, TempRowBegin, TempColBegin, TempRowEnd, TempColEnd, TempNr, TempNc, TempDist)* 計算擬合的直線和點之間的距離distance_pl (Rows, Columns, TempRowBegin, TempColBegin, TempRowEnd, TempColEnd, Distance)tuple_max (Distance, Max)* 在聯系的刪除點中是不是有足夠的點來擬合* 刪除max/2的點if(Max < MinDist[MinDistIndex])breakendif* 刪除不符合點到直線距離的點tuple_less_elem (Distance, Max/2, Less)tuple_find (Less, 0, Indices)tuple_remove (Rows, Indices, ValidRows)tuple_remove (Columns, Indices, ValidCols)三、獲得中線
核心代碼:
*求直線和圓的交叉點gen_circle_contour_xld (ContCircle, Row, Column, Distance1, 0, 6.28318, 'positive', 1)gen_circle_contour_xld (ContCircle2, Row, Column, Distance2, 0, 6.28318, 'positive', 1)intersection_line_circle (line2[0], line2[1], line2[2], line2[3], Row, Column, Distance1, 0, 6.28318, 'positive', Row1, Column1)intersection_line_circle (line2[0], line2[1], line2[2], line2[3], Row, Column, Distance2, 0, 6.28318, 'positive', Row2, Column2)* 顯示交點總結
以上是生活随笔為你收集整理的项目实战 五 拟合直线 获得中线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青蛙学Linux—NFS
- 下一篇: TideSec远控免杀学习四(BackD