본문 바로가기
비젼/메트록스

Mil 샘플-Mod_1개의 모델 찾기

by jeong-f 2022. 2. 11.
반응형

필요 라이선스 : MXRT xxGxxx 000  : Geometric Model Finder
기능 : 모델파인드를 이용하여 1개의 모델 찾기
목적 : Mil의 샘플프로그램 코드를 참조하여 코드 작성 없이 테스트용 프로그램으로 적용하는 방법 구현

모델 등록하기

  1. 파일 열기 :  C:\Program Files\Matrox Imaging\Images\SingleModel.mim
  2. 이미지로 선택
  3. Define(적용)
  4. 속도 : 아주 빠르게
  5. 준비

테스트

  1. 파일 열기 :  C:\Program Files\Matrox Imaging\Images\SingleTarget.mim
  2. 검색

 

샘플 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//*****************************************************************************
        // Single model example.
        //
        // Source MIL image file specifications.
        private const string SINGLE_MODEL_IMAGE = MIL.M_IMAGE_PATH + "SingleModel.mim";
 
        // Target MIL image file specifications.
        private const string SINGLE_MODEL_TARGET_IMAGE = MIL.M_IMAGE_PATH + "SingleTarget.mim";
 
        //Search speed: M_VERY_HIGH for faster search, M_MEDIUM for precision and robustness.
        private const int SINGLE_MODEL_SEARCH_SPEED = MIL.M_VERY_HIGH;
 
        // Model specifications.
        private const int MODEL_OFFSETX = 176;
        private const int MODEL_OFFSETY = 136;
        private const int MODEL_SIZEX = 128;
        private const int MODEL_SIZEY = 128;
        private const int MODEL_MAX_OCCURRENCES = 16;
 
        static void SingleModelExample(MIL_ID MilSystem, MIL_ID MilDisplay)
        {
            MIL_ID MilImage = MIL.M_NULL;                               // Image buffer identifier.
            MIL_ID GraphicList = MIL.M_NULL;                            // Graphic list indentifier.
            MIL_ID MilSearchContext = MIL.M_NULL;                       // Search context.
            MIL_ID MilResult = MIL.M_NULL;                              // Result identifier.
            double ModelDrawColor = MIL.M_COLOR_RED;                    // Model draw color.
            MIL_INT[] Model = new MIL_INT[MODEL_MAX_OCCURRENCES];               // Model index.
            MIL_INT NumResults = 0;                                         // Number of results found.
 
            double[] Score = new double[MODEL_MAX_OCCURRENCES];         // Model correlation score.
            double[] XPosition = new double[MODEL_MAX_OCCURRENCES];     // Model X position.
            double[] YPosition = new double[MODEL_MAX_OCCURRENCES];     // Model Y position. 
            double[] Angle = new double[MODEL_MAX_OCCURRENCES];         // Model occurrence angle.
            double[] Scale = new double[MODEL_MAX_OCCURRENCES];         // Model occurrence scale.
            double Time = 0.0;                                          // Bench variable.
            int i = 0;                                                  // Loop variable.
 
            // Restore the model image and display it.
            MIL.MbufRestore(SINGLE_MODEL_IMAGE, MilSystem, ref MilImage);
            MIL.MdispSelect(MilDisplay, MilImage);
 
            // Allocate a graphic list to hold the subpixel annotations to draw.
            MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref GraphicList);
 
            // Associate the graphic list to the display for annotations.
            MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, GraphicList);
 
            // Allocate a Geometric Model Finder context.
            MIL.MmodAlloc(MilSystem, MIL.M_GEOMETRIC, MIL.M_DEFAULT, ref MilSearchContext);
 
            // Allocate a result buffer.
            MIL.MmodAllocResult(MilSystem, MIL.M_DEFAULT, ref MilResult);
 
            // Define the model.
            MIL.MmodDefine(MilSearchContext, MIL.M_IMAGE, MilImage, MODEL_OFFSETX, MODEL_OFFSETY, MODEL_SIZEX, MODEL_SIZEY);
 
            // Set the search speed.
            MIL.MmodControl(MilSearchContext, MIL.M_CONTEXT, MIL.M_SPEED, SINGLE_MODEL_SEARCH_SPEED);
 
            // Preprocess the search context.
            MIL.MmodPreprocess(MilSearchContext, MIL.M_DEFAULT);
 
            // Draw box and position it in the source image to show the model.
            MIL.MgraColor(MIL.M_DEFAULT, ModelDrawColor);
            MIL.MmodDraw(MIL.M_DEFAULT, MilSearchContext, GraphicList,
                     MIL.M_DRAW_BOX + MIL.M_DRAW_POSITION, 0, MIL.M_ORIGINAL);
 
            // Pause to show the model.
            Console.Write("\nGEOMETRIC MODEL FINDER:\n");
            Console.Write("-----------------------\n\n");
            Console.Write("A model context was defined with the model in the displayed image.\n");
            Console.Write("Press <Enter> to continue.\n\n");
            Console.ReadKey();
 
            // Clear annotations.
            MIL.MgraClear(MIL.M_DEFAULT, GraphicList);
 
            // Load the single model target image.
            MIL.MbufLoad(SINGLE_MODEL_TARGET_IMAGE, MilImage);
 
            // Dummy first call for bench measure purpose only (bench stabilization, cache effect, etc...). This first call is NOT required by the application.
            MIL.MmodFind(MilSearchContext, MilImage, MilResult);
 
            // Reset the timer.
            MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_RESET + MIL.M_SYNCHRONOUS, MIL.M_NULL);
 
            // Find the model.
            MIL.MmodFind(MilSearchContext, MilImage, MilResult);
 
            // Read the find time.
            MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, ref Time);
 
            // Get the number of models found.
            MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_NUMBER + MIL.M_TYPE_MIL_INT, ref NumResults);
 
            // If a model was found above the acceptance threshold.
            if ((NumResults >= 1&& (NumResults <= MODEL_MAX_OCCURRENCES))
            {
                // Get the results of the single model.
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_INDEX + MIL.M_TYPE_MIL_INT, Model);
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_POSITION_X, XPosition);
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_POSITION_Y, YPosition);
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_ANGLE, Angle);
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_SCALE, Scale);
                MIL.MmodGetResult(MilResult, MIL.M_DEFAULT, MIL.M_SCORE, Score);
 
                // Print the results for each model found.
                Console.Write("The model was found in the target image:\n\n");
                Console.Write("Result   Model   X Position   Y Position   Angle   Scale   Score\n\n");
                for (i = 0; i < NumResults; i++)
                {
                    Console.Write("{0,-9}{1,-8}{2,-13:0.00}{3,-13:0.00}{4,-8:0.00}{5,-8:0.00}{6,-5:0.00}%\n", i, Model[i], XPosition[i], YPosition[i], Angle[i], Scale[i], Score[i]);
                }
                Console.Write("\nThe search time is {0:0.0} ms\n\n", Time * 1000.0);
 
                // Draw edges, position and box over the occurrences that were found.
                for (i = 0; i < NumResults; i++)
                {
                    MIL.MgraColor(MIL.M_DEFAULT, ModelDrawColor);
                    MIL.MmodDraw(MIL.M_DEFAULT, MilResult, GraphicList, MIL.M_DRAW_EDGES + MIL.M_DRAW_BOX + MIL.M_DRAW_POSITION, i, MIL.M_DEFAULT);
                }
            }
            else
            {
                Console.Write("The model was not found or the number of models found is greater than\n");
                Console.Write("the specified maximum number of occurrence !\n\n");
            }
 
            // Wait for a key to be pressed.
            Console.Write("Press <Enter> to continue.\n\n");
            Console.ReadKey();
 
            // Free MIL objects.
            MIL.MgraFree(GraphicList);
            MIL.MbufFree(MilImage);
            MIL.MmodFree(MilSearchContext);
            MIL.MmodFree(MilResult);
 
        }
cs
반응형

'비젼 > 메트록스' 카테고리의 다른 글

Mil 샘플-Mod_다중 모델 찾기  (0) 2022.02.11
Matrox MIL 라이브러리- 라이센스 선택 방법  (0) 2022.02.10
Matrox Mil GigE 사용 설정  (0) 2022.02.07

댓글