点列を歪んだ座標へ変換

Namespace: fvalgcli
Assembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)

Syntax

C#
public static int fnFIE_calib_distort_points(
	F_CAMERA_PARAM camera,
	DPNT_T_PTR src_points,
	DPNT_T_PTR dst_points,
	int num_points
)
Visual Basic
Public Shared Function fnFIE_calib_distort_points ( 
	camera As F_CAMERA_PARAM,
	src_points As DPNT_T_PTR,
	dst_points As DPNT_T_PTR,
	num_points As Integer
) As Integer

Parameters

camera
Type: fvalgcli..::..F_CAMERA_PARAM
カメラ内部パラメータ構造体
src_points
Type: fvalgcli..::..DPNT_T_PTR
理想画像座標系における点の配列
dst_points
Type: fvalgcli..::..DPNT_T_PTR
カメラ画像座標系における点の配列
num_points
Type: System..::..Int32
src_points, dst_points の点数

Return Value

Type: Int32
以下のエラーコードを返します。

エラーコード:
f_err内容
F_ERR_NONE正常終了
F_ERR_NOMEMORYメモリ不足エラー
F_ERR_INVALID_IMAGE画像オブジェクトの異常
F_ERR_INVALID_PARAMパラメータ異常
F_ERR_CALC_IMPOSSIBLE カメラ内部パラメータの逆行列が計算不能
F_ERR_NO_LICENCEライセンスエラー、または未初期化エラー

Remarks

Examples

C# Copy imageCopy
//    $Revision: 1.1 $

using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;

namespace TC
{
    public partial class FIE
    {
        /// <summary>
        /// 点列を歪んだ座標へ変換.
        /// </summary>
        [FvPluginExecute]
        public void fnFIE_calib_distort_points()
        {
            int status = (int)f_err.F_ERR_NONE;

            // 内部パラメータ.
            F_CAMERA_PARAM camera = F_CAMERA_PARAM.init(916.396023110107, 910.774803134449,
                                                        1.12644931840078, 331.36766487411,
                                                        227.057842377842, -0.215845914024188,
                                                        0.0707690551914399);
            DPNT_T_PTR src_points = DPNT_T_PTR.Zero;    // 理想画像座標系における座標列.
            DPNT_T_PTR dst_points = DPNT_T_PTR.Zero;    // カメラ座標系における座標列.
            int num_points = 63;

            DPNT_T_PTR ans_dst_points = DPNT_T_PTR.Zero;    // 正解座標.
            bool check = true;                                // エラー確認.

            try
            {
                // 理想画像座標系における座標列を取得.
                src_points = fnFIE_calib_undistort_points();

                // カメラ座標系に変換する.
                dst_points = DPNT_T_PTR.alloc(num_points);
                status = api.fnFIE_calib_distort_points(camera, src_points, dst_points, num_points);
                Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status);

                // 正解座標の設定.
                ans_dst_points = DPNT_T_PTR.alloc(num_points);
                ans_dst_points[0] = DPNT_T.init(213.24395404796, 190.311292024222);
                ans_dst_points[1] = DPNT_T.init(229.335021466696, 181.334680391695);
                ans_dst_points[2] = DPNT_T.init(244.933501337445, 172.470122515202);
                ans_dst_points[3] = DPNT_T.init(260.226878214761, 163.715363509235);
                ans_dst_points[4] = DPNT_T.init(275.161632518758, 155.278157403805);
                ans_dst_points[5] = DPNT_T.init(289.806566754944, 147.235711017003);
                ans_dst_points[6] = DPNT_T.init(304.082323285824, 139.201336084572);
                ans_dst_points[7] = DPNT_T.init(318.020154796773, 131.208977434617);
                ans_dst_points[8] = DPNT_T.init(226.94672323513, 200.212244723243);
                ans_dst_points[9] = DPNT_T.init(243.120590217004, 191.108448046774);
                ans_dst_points[10] = DPNT_T.init(258.737641792819, 182.166086457894);
                ans_dst_points[11] = DPNT_T.init(274.019507906095, 173.0793282196);
                ans_dst_points[12] = DPNT_T.init(289.039969361128, 164.304619942571);
                ans_dst_points[13] = DPNT_T.init(303.703260862565, 156.182291677402);
                ans_dst_points[14] = DPNT_T.init(317.968662175694, 147.924325479669);
                ans_dst_points[15] = DPNT_T.init(331.911979607955, 139.74970369127);
                ans_dst_points[16] = DPNT_T.init(241.020279403946, 210.375649054809);
                ans_dst_points[17] = DPNT_T.init(257.205715368625, 201.036173757288);
                ans_dst_points[18] = DPNT_T.init(272.866778882389, 192.041340231168);
                ans_dst_points[19] = DPNT_T.init(288.201578792868, 182.851334317472);
                ans_dst_points[20] = DPNT_T.init(303.206389100302, 173.708309747723);
                ans_dst_points[21] = DPNT_T.init(317.863360743057, 165.21563674231);
                ans_dst_points[22] = DPNT_T.init(332.127111289358, 156.821469251458);
                ans_dst_points[23] = DPNT_T.init(346.048778126886, 148.515514486676);
                ans_dst_points[24] = DPNT_T.init(255.440662431599, 220.76941669048);
                ans_dst_points[25] = DPNT_T.init(271.640321442673, 211.16675896514);
                ans_dst_points[26] = DPNT_T.init(287.346339419706, 202.063943578895);
                ans_dst_points[27] = DPNT_T.init(302.678054082353, 192.768205671965);
                ans_dst_points[28] = DPNT_T.init(317.674780620987, 183.443418956804);
                ans_dst_points[29] = DPNT_T.init(332.332549573555, 174.556714651622);
                ans_dst_points[30] = DPNT_T.init(346.592296356343, 165.986147086254);
                ans_dst_points[31] = DPNT_T.init(360.473933665674, 157.514395749875);
                ans_dst_points[32] = DPNT_T.init(270.242355959698, 231.433365737018);
                ans_dst_points[33] = DPNT_T.init(286.483225663192, 221.521709645002);
                ans_dst_points[34] = DPNT_T.init(302.188130790179, 212.24167581418);
                ans_dst_points[35] = DPNT_T.init(317.505990815912, 202.875387342348);
                ans_dst_points[36] = DPNT_T.init(332.516072797937, 193.424331233975);
                ans_dst_points[37] = DPNT_T.init(347.167709779954, 184.236878741684);
                ans_dst_points[38] = DPNT_T.init(361.375960978495, 175.414903728467);
                ans_dst_points[39] = DPNT_T.init(375.245005268494, 166.725379041244);
                ans_dst_points[40] = DPNT_T.init(285.470773728561, 242.446260562339);
                ans_dst_points[41] = DPNT_T.init(301.755356275743, 232.13513740684);
                ans_dst_points[42] = DPNT_T.init(317.447602300534, 222.616743816637);
                ans_dst_points[43] = DPNT_T.init(332.750793277736, 213.183774736544);
                ans_dst_points[44] = DPNT_T.init(347.728840918461, 203.612355406336);
                ans_dst_points[45] = DPNT_T.init(362.332264894307, 194.130422161767);
                ans_dst_points[46] = DPNT_T.init(376.521007422223, 185.087872041759);
                ans_dst_points[47] = DPNT_T.init(390.334444784114, 176.185902842029);
                ans_dst_points[48] = DPNT_T.init(301.119758764442, 253.828136581168);
                ans_dst_points[49] = DPNT_T.init(317.40270681525, 243.122569476905);
                ans_dst_points[50] = DPNT_T.init(333.113328801149, 233.235753561367);
                ans_dst_points[51] = DPNT_T.init(348.379295929693, 223.597391964778);
                ans_dst_points[52] = DPNT_T.init(363.347388021193, 213.830849301134);
                ans_dst_points[53] = DPNT_T.init(377.89792724626, 204.187968291296);
                ans_dst_points[54] = DPNT_T.init(392.050623693916, 194.996268034167);
                ans_dst_points[55] = DPNT_T.init(405.792517727835, 185.827085605083);
                ans_dst_points[56] = DPNT_T.init(317.250040807483, 265.602212913667);
                ans_dst_points[57] = DPNT_T.init(333.526099659099, 254.528747362569);
                ans_dst_points[58] = DPNT_T.init(349.198988635507, 244.222931491623);
                ans_dst_points[59] = DPNT_T.init(364.474079951, 234.264898868493);
                ans_dst_points[60] = DPNT_T.init(379.403799492724, 224.310359435497);
                ans_dst_points[61] = DPNT_T.init(393.855953440183, 214.568709972276);
                ans_dst_points[62] = DPNT_T.init(407.936151999305, 205.081373693009);

                for(int i = 0; i < num_points; i++)
                {
                    if(!compare(dst_points[i].x, ans_dst_points[i].x, 1e-1)) check = false;
                    if(!compare(dst_points[i].y, ans_dst_points[i].y, 1e-1)) check = false;
                }

                // 比較.
                ConsoleOut.WriteFunctionName(":\t");
                Console.Write(" ...");
                ConsoleOut.IsTrue(check);
                Console.Write("\n");
            }
            finally
            {
                src_points.Dispose();
                dst_points.Dispose();
                ans_dst_points.Dispose();
            }
        }
    }
}


Visual Basic Copy imageCopy
'    $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports fvalgcli

Public Partial Class FIE
    ''' <summary>
    ''' 点列を歪んだ座標へ変換.
    ''' </summary>
    <FvPluginExecute> _
    Public Sub fnFIE_calib_distort_points()
        Dim status As Integer = CInt(f_err.F_ERR_NONE)

        ' 内部パラメータ.
        Dim camera As F_CAMERA_PARAM = F_CAMERA_PARAM.init(916.396023110107, 910.774803134449, 1.12644931840078, 331.36766487411, 227.057842377842, -0.215845914024188, _
            0.0707690551914399)
        Dim src_points As DPNT_T_PTR = DPNT_T_PTR.Zero
        ' 理想画像座標系における座標列.
        Dim dst_points As DPNT_T_PTR = DPNT_T_PTR.Zero
        ' カメラ座標系における座標列.
        Dim num_points As Integer = 63

        Dim ans_dst_points As DPNT_T_PTR = DPNT_T_PTR.Zero
        ' 正解座標.
        Dim check As Boolean = True
        ' エラー確認.
        Try
            ' 理想画像座標系における座標列を取得.
            src_points = fnFIE_calib_undistort_points()

            ' カメラ座標系に変換する.
            dst_points = DPNT_T_PTR.alloc(num_points)
            status = api.fnFIE_calib_distort_points(camera, src_points, dst_points, num_points)
            Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err))

            ' 正解座標の設定.
            ans_dst_points = DPNT_T_PTR.alloc(num_points)
            ans_dst_points(0) = DPNT_T.init(213.24395404796, 190.311292024222)
            ans_dst_points(1) = DPNT_T.init(229.335021466696, 181.334680391695)
            ans_dst_points(2) = DPNT_T.init(244.933501337445, 172.470122515202)
            ans_dst_points(3) = DPNT_T.init(260.226878214761, 163.715363509235)
            ans_dst_points(4) = DPNT_T.init(275.161632518758, 155.278157403805)
            ans_dst_points(5) = DPNT_T.init(289.806566754944, 147.235711017003)
            ans_dst_points(6) = DPNT_T.init(304.082323285824, 139.201336084572)
            ans_dst_points(7) = DPNT_T.init(318.020154796773, 131.208977434617)
            ans_dst_points(8) = DPNT_T.init(226.94672323513, 200.212244723243)
            ans_dst_points(9) = DPNT_T.init(243.120590217004, 191.108448046774)
            ans_dst_points(10) = DPNT_T.init(258.737641792819, 182.166086457894)
            ans_dst_points(11) = DPNT_T.init(274.019507906095, 173.0793282196)
            ans_dst_points(12) = DPNT_T.init(289.039969361128, 164.304619942571)
            ans_dst_points(13) = DPNT_T.init(303.703260862565, 156.182291677402)
            ans_dst_points(14) = DPNT_T.init(317.968662175694, 147.924325479669)
            ans_dst_points(15) = DPNT_T.init(331.911979607955, 139.74970369127)
            ans_dst_points(16) = DPNT_T.init(241.020279403946, 210.375649054809)
            ans_dst_points(17) = DPNT_T.init(257.205715368625, 201.036173757288)
            ans_dst_points(18) = DPNT_T.init(272.866778882389, 192.041340231168)
            ans_dst_points(19) = DPNT_T.init(288.201578792868, 182.851334317472)
            ans_dst_points(20) = DPNT_T.init(303.206389100302, 173.708309747723)
            ans_dst_points(21) = DPNT_T.init(317.863360743057, 165.21563674231)
            ans_dst_points(22) = DPNT_T.init(332.127111289358, 156.821469251458)
            ans_dst_points(23) = DPNT_T.init(346.048778126886, 148.515514486676)
            ans_dst_points(24) = DPNT_T.init(255.440662431599, 220.76941669048)
            ans_dst_points(25) = DPNT_T.init(271.640321442673, 211.16675896514)
            ans_dst_points(26) = DPNT_T.init(287.346339419706, 202.063943578895)
            ans_dst_points(27) = DPNT_T.init(302.678054082353, 192.768205671965)
            ans_dst_points(28) = DPNT_T.init(317.674780620987, 183.443418956804)
            ans_dst_points(29) = DPNT_T.init(332.332549573555, 174.556714651622)
            ans_dst_points(30) = DPNT_T.init(346.592296356343, 165.986147086254)
            ans_dst_points(31) = DPNT_T.init(360.473933665674, 157.514395749875)
            ans_dst_points(32) = DPNT_T.init(270.242355959698, 231.433365737018)
            ans_dst_points(33) = DPNT_T.init(286.483225663192, 221.521709645002)
            ans_dst_points(34) = DPNT_T.init(302.188130790179, 212.24167581418)
            ans_dst_points(35) = DPNT_T.init(317.505990815912, 202.875387342348)
            ans_dst_points(36) = DPNT_T.init(332.516072797937, 193.424331233975)
            ans_dst_points(37) = DPNT_T.init(347.167709779954, 184.236878741684)
            ans_dst_points(38) = DPNT_T.init(361.375960978495, 175.414903728467)
            ans_dst_points(39) = DPNT_T.init(375.245005268494, 166.725379041244)
            ans_dst_points(40) = DPNT_T.init(285.470773728561, 242.446260562339)
            ans_dst_points(41) = DPNT_T.init(301.755356275743, 232.13513740684)
            ans_dst_points(42) = DPNT_T.init(317.447602300534, 222.616743816637)
            ans_dst_points(43) = DPNT_T.init(332.750793277736, 213.183774736544)
            ans_dst_points(44) = DPNT_T.init(347.728840918461, 203.612355406336)
            ans_dst_points(45) = DPNT_T.init(362.332264894307, 194.130422161767)
            ans_dst_points(46) = DPNT_T.init(376.521007422223, 185.087872041759)
            ans_dst_points(47) = DPNT_T.init(390.334444784114, 176.185902842029)
            ans_dst_points(48) = DPNT_T.init(301.119758764442, 253.828136581168)
            ans_dst_points(49) = DPNT_T.init(317.40270681525, 243.122569476905)
            ans_dst_points(50) = DPNT_T.init(333.113328801149, 233.235753561367)
            ans_dst_points(51) = DPNT_T.init(348.379295929693, 223.597391964778)
            ans_dst_points(52) = DPNT_T.init(363.347388021193, 213.830849301134)
            ans_dst_points(53) = DPNT_T.init(377.89792724626, 204.187968291296)
            ans_dst_points(54) = DPNT_T.init(392.050623693916, 194.996268034167)
            ans_dst_points(55) = DPNT_T.init(405.792517727835, 185.827085605083)
            ans_dst_points(56) = DPNT_T.init(317.250040807483, 265.602212913667)
            ans_dst_points(57) = DPNT_T.init(333.526099659099, 254.528747362569)
            ans_dst_points(58) = DPNT_T.init(349.198988635507, 244.222931491623)
            ans_dst_points(59) = DPNT_T.init(364.474079951, 234.264898868493)
            ans_dst_points(60) = DPNT_T.init(379.403799492724, 224.310359435497)
            ans_dst_points(61) = DPNT_T.init(393.855953440183, 214.568709972276)
            ans_dst_points(62) = DPNT_T.init(407.936151999305, 205.081373693009)

            For i As Integer = 0 To num_points - 1
                If Not compare(dst_points(i).x, ans_dst_points(i).x, 0.1) Then
                    check = False
                End If
                If Not compare(dst_points(i).y, ans_dst_points(i).y, 0.1) Then
                    check = False
                End If
            Next

            ' 比較.
            ConsoleOut.WriteFunctionName(":" & vbTab)
            Console.Write(" ...")
            ConsoleOut.IsTrue(check)
            Console.Write(vbLf)
        Finally
            src_points.Dispose()
            dst_points.Dispose()
            ans_dst_points.Dispose()
        End Try
    End Sub
End Class

See Also