直線の再検出 (実数版)
Namespace: FVIL.HoughAssembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)
Syntax
C# |
---|
public static F_LH_LINE RefineByLSM( F_LH_LINE line, CFviEdgeResultD64 edges, int err_r, int err_q, ref int points_num ) |
Visual Basic |
---|
Public Shared Function RefineByLSM ( line As F_LH_LINE, edges As CFviEdgeResultD64, err_r As Integer, err_q As Integer, ByRef points_num As Integer ) As F_LH_LINE |
Parameters
- line
- Type: fvalgcli..::..F_LH_LINE
直線ハフ検出データ
- edges
- Type: FVIL.Edge..::..CFviEdgeResultD64
エッジ点列 (1点以上)
- err_r
- Type: System..::..Int32
ρ方向許容誤差 (0~)
- err_q
- Type: System..::..Int32
θ方向許容誤差 (0~)
- points_num
- Type: System..::..Int32%
直線の上にあるエッジ点の数
Return Value
Type: F_LH_LINE直線係数を最小二乗法で求め直します。
Remarks
指定された1本の直線とエッジ点群から、その直線の近くにあると判定される点群を選び出し、 これらに対して最小二乗法で直線の方程式を求め直します。
line には、 LineHough(CFviEdgeResultD64, CFviLineHoughParam) で得られた結果(複数の直線)の内の1つを指定してください。
edges には、直線の近くにある可能性のあるエッジ点列を指定します。 LineHough(CFviEdgeResultD64, CFviLineHoughParam) で指定したエッジ点列をそのまま入力して構いません。 若しくは、何らかの方法によって候補を絞ったものを入力しても結構です。 このエッジ点列の中から直線上にある点が選ばれます。
err_r 及び err_q は、直線付近のエッジ点群を選び出す為に使用します。 詳しくは、 GetSupportEdges(F_LH_LINE, CFviEdgeResultD64, Int32, Int32, SortType%) の解説をご参照ください。
err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。 具体的には、直線の向きとエッジ点の向きとの差の絶対値が err_q 以内の場合、 このエッジ点が直線の真のエッジであると判定されます。(下図参照)
処理に失敗した場合は例外を発行します。 例外の原因と発生位置を特定するには、発行された例外クラスの ErrorCode メンバと FunctionEx メンバを参照してください。
エラーコード:
値 | ErrorCode メンバ | 内容 |
---|---|---|
51 | FVIL.ErrorCode.LICENSE_ERROR | ライセンスキーが見つからない為、実行できません。 または、 FVIL._SetUp.InitVisionLibrary が実行されていません。 |
11 | FVIL.ErrorCode.INVALID_PARAMETER | パラメータに誤りがあります。 |
1 | FVIL.ErrorCode.FAILED_TO_ALLOCATE | メモリの確保に失敗しました。 |
29 | FVIL.ErrorCode.NOT_CALCULABLE | 計算不可能です。 |
Examples
ソースコード:
C# | Copy |
---|---|
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using fvalgcli; // FvPluginXXXX attribute requires fvalgcli namespace User.SampleCode { public partial class Hough { // ============================================================ /// <summary> /// Hough.Function.RefineByLSM メソッド. /// </summary> /// <remarks> /// RefineByLSM (F_LH_LINE, CFviEdgeResultD64, Int32, Int32, Int32) /// </remarks> [FvPluginExecute] public void RefineByLSM_D64() { // 1) インスタンスの準備. FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(); FVIL.Hough.CFviLineHoughParam param = new FVIL.Hough.CFviLineHoughParam(); // 2) 処理対象画像の取り込み. FVIL.File.Function.LoadImageFile(Defs.TestImageDir + "/floppy_hough.jpg", src, FVIL.PixelMode.Unpacking); // 3) パラメータの設定. param.AngleEd = new FVIL.Data.CFviAngle(359.0); param.AngleSt = new FVIL.Data.CFviAngle(0.0); param.VoteWidth = 10; param.RegionQ = 10; param.RegionR = 10; // 4) 画像処理実行. // --(1) エッジ点の取得. FVIL.Edge.CFviEdgeResultD64 result = GetEdge2D_EdgeResultD64(src); // --(2) 直線ハフ検出. FVIL.F_LH_LINE_ARRAY array = FVIL.Hough.FunctionEx.LineHough(result, param); if (0 == array.Count) Assert.Fail(" 直線が見つかりません."); // --(3) RefineByLSM 実行. int point_num = 0; fvalgcli.F_LH_LINE line = FVIL.Hough.FunctionEx.RefineByLSM(array[0], result, 3, 3, ref point_num); // E) 確認. Console.WriteLine("a = {0}, b = {1}, c = {2}, q = {3}, score = {4} point_num = {5}", line.a, line.b, line.c, line.q, line.score, point_num); } } } |
Visual Basic | Copy |
---|---|
Imports System.Collections.Generic Imports System.Text Imports System.Drawing Imports fvalgcli ' FvPluginXXXX attribute requires fvalgcli Namespace SampleCode Public Partial Class Hough ' ============================================================ ''' <summary> ''' Hough.Function.RefineByLSM メソッド. ''' </summary> ''' <remarks> ''' RefineByLSM (F_LH_LINE, CFviEdgeResultD64, Int32, Int32, Int32) ''' </remarks> <FvPluginExecute> _ Public Sub RefineByLSM_D64() ' 1) インスタンスの準備. Dim src As New FVIL.Data.CFviImage() Dim param As New FVIL.Hough.CFviLineHoughParam() ' 2) 処理対象画像の取り込み. FVIL.File.[Function].LoadImageFile(Defs.TestImageDir & "/floppy_hough.jpg", src, FVIL.PixelMode.Unpacking) ' 3) パラメータの設定. param.AngleEd = New FVIL.Data.CFviAngle(359.0) param.AngleSt = New FVIL.Data.CFviAngle(0.0) param.VoteWidth = 10 param.RegionQ = 10 param.RegionR = 10 ' 4) 画像処理実行. ' --(1) エッジ点の取得. Dim result As FVIL.Edge.CFviEdgeResultD64 = GetEdge2D_EdgeResultD64(src) ' --(2) 直線ハフ検出. Dim array As FVIL.F_LH_LINE_ARRAY = FVIL.Hough.FunctionEx.LineHough(result, param) If 0 = array.Count Then Assert.Fail(" 直線が見つかりません.") End If ' --(3) RefineByLSM 実行. Dim point_num As Integer = 0 Dim line As fvalgcli.F_LH_LINE = FVIL.Hough.FunctionEx.RefineByLSM(array(0), result, 3, 3, point_num) ' E) 確認. Console.WriteLine("a = {0}, b = {1}, c = {2}, q = {3}, score = {4} point_num = {5}", line.a, line.b, line.c, line.q, line.score, _ point_num) End Sub End Class End Namespace |
C# | Copy |
---|---|
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using fvalgcli; // FvPluginXXXX attribute requires fvalgcli namespace User.SampleCode { public partial class Hough { // ============================================================ /// <summary> /// エッジ点の取得. /// </summary> /// <remarks> /// CFviEdge2D. /// CFviEdge2DSobelParam. /// CFviEdgeResultD64. /// </remarks> private FVIL.Edge.CFviEdgeResultD64 GetEdge2D_EdgeResultD64(FVIL.Data.CFviImage src) { // 1) インスタンスの準備. FVIL.Edge.CFviEdge2D parser = new FVIL.Edge.CFviEdge2D(); FVIL.Edge.CFviEdgeResultD64 result = new FVIL.Edge.CFviEdgeResultD64(); FVIL.Edge.CFviEdge2DSobelParam param = new FVIL.Edge.CFviEdge2DSobelParam(); FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage(); // 2) 処理対象画像の有効性検査. int valid = FVIL.Edge.CFviEdge2D.CheckValidity(src); if (valid != FVIL.ErrorCode._SUCCESS) throw new FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity"); // 3) 画像処理準備 (共通) parser.SrcImages[0] = src; parser.DstImages[0] = dst; if (!parser.IsValid()) // 有効性検査. parser.Validate(); // 有効化. parser.Result = result; // 4-1) パラメータ設定 (継承) parser.BorderMode = FVIL.BorderMode.None; parser.MagMode = FVIL.Edge.MagMode.XY; parser.SaveMode = FVIL.Edge.SaveMode.Mag | FVIL.Edge.SaveMode.Direct; // 4-2) パラメータ設定 (固有) param.EdgeThreshold = 120; param.NmsLength = 1; parser.Param = param; // 5) 画像処理実行. parser.Execute(); return result; } } } |
Visual Basic | Copy |
---|---|
Imports System.Collections.Generic Imports System.Text Imports System.Drawing Imports fvalgcli ' FvPluginXXXX attribute requires fvalgcli Namespace SampleCode Public Partial Class Hough ' ============================================================ ''' <summary> ''' エッジ点の取得. ''' </summary> ''' <remarks> ''' CFviEdge2D. ''' CFviEdge2DSobelParam. ''' CFviEdgeResultD64. ''' </remarks> Private Function GetEdge2D_EdgeResultD64(src As FVIL.Data.CFviImage) As FVIL.Edge.CFviEdgeResultD64 ' 1) インスタンスの準備. Dim parser As New FVIL.Edge.CFviEdge2D() Dim result As New FVIL.Edge.CFviEdgeResultD64() Dim param As New FVIL.Edge.CFviEdge2DSobelParam() Dim dst As New FVIL.Data.CFviImage() ' 2) 処理対象画像の有効性検査. Dim valid As Integer = FVIL.Edge.CFviEdge2D.CheckValidity(src) If valid <> FVIL.ErrorCode._SUCCESS Then Throw New FVIL.CFviException(valid, "FVIL.Edge.CFviEdge2D.CheckValidity") End If ' 3) 画像処理準備 (共通) parser.SrcImages(0) = src parser.DstImages(0) = dst If Not parser.IsValid() Then ' 有効性検査. parser.Validate() End If ' 有効化. parser.Result = result ' 4-1) パラメータ設定 (継承) parser.BorderMode = FVIL.BorderMode.None parser.MagMode = FVIL.Edge.MagMode.XY parser.SaveMode = FVIL.Edge.SaveMode.Mag Or FVIL.Edge.SaveMode.Direct ' 4-2) パラメータ設定 (固有) param.EdgeThreshold = 120 param.NmsLength = 1 parser.Param = param ' 5) 画像処理実行. parser.Execute() Return result End Function End Class End Namespace |
Exceptions
Exception | Condition |
---|---|
FVIL..::..CFviException | この例外の原因については、上記のエラーコード表をご参照ください。 |