Measurement의 Stripe Marker를 이용하여 측정을 어떻게 하는지 알아보겠습니다.
Measurement 샘플 코드
아래의 샘플 이미지에서 노란색으로 표시된 부분을 측정해 보도록 하겠습니다.
노란색 상자는 Measurement Box입니다.입니다 주의할 점은 Box의 각도가 정방향이 아닙니다. 그리고 오브젝트가 90도 수직이 아니라 약간 기울어 있습니다. 따라서 Box도 오브젝트에 따라 Angle을 지정해야 한다는 얘기가 됩니다.
코딩
MIL_ID MilStripMarker;
double vWidth;
CString strWidth;
MmeasAllocMarker(MilSystem, M_STRIPE, M_DEFAULT, &MilStripMarker);
MmeasSetMarker(MilStripMarker, M_BOX_ORIGIN, 166, 130);
MmeasSetMarker(MilStripMarker, M_BOX_SIZE, 128, 100);
MmeasSetMarker(MilStripMarker, M_POLARITY, M_POSITIVE, M_NEGATIVE);
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_MODE, M_ENABLE, M_NULL);
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_DELTA_POS, 90, M_NULL);
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_INTERPOLATION_MODE, M_BILINEAR, M_NULL);
MmeasSetMarker(MilStripMarker, M_WIDTH, 45, M_NULL);
MmeasSetMarker(MilStripMarker, M_WIDTH_VARIATION, 10, M_NULL);
MmeasFindMarker(M_DEFAULT, MilTargetImage, MilStripMarker, M_CONTRAST);
MmeasDraw(M_DEFAULT, MilStripMarker, MilOverlay, M_DRAW_WIDTH+M_DRAW_BOX, M_DEFAULT, M_RESULT);
MmeasGetResult(MilStripMarker, M_WIDTH, &vWidth, M_NULL);
strWidth.Format("Width= %. 3f pixels", vWidth);
MgraText(M_DEFAULT, MilOverlay, 0, 0, (char*)(const char*) strWidth);
MmeasFree(MilStripMarker);
코드 분석
MIL_ID MilStripMarker;
double vWidth;
CString strWidth;
// 1. Alloc
MmeasAllocMarker(MilSystem, M_STRIPE, M_DEFAULT, &MilStripMarker);
Marker에 대한 할당을 합니다. 두 번째 인자가 M_STRIPE로 되어 있다는거 확인하세요.
stripe 외에도 edge, point 등으로 설정 가능합니다. 궁금한 점은 바로 Mil Help 파일에서 검색 가능합니다.
// 2. Marker Setting
MmeasSetMarker(MilStripMarker, M_BOX_ORIGIN, 166, 130);
MmeasSetMarker(MilStripMarker, M_BOX_SIZE, 128, 100);
MmeasSetMarker(MilStripMarker, M_POLARITY, M_POSITIVE, M_NEGATIVE);
Marker에 대한 셋팅입니다.
M_BOX_ORIGIN: 박스의 위치를 지정할 offset 값 입니다값입니다.
M_BOX_SIZE: 박스의 크기를 지정합니다.
M_POLARITY: 마커의 극성을 설정합니다.
좌측은 positive, 우측은 negative로 설정했는데요, 위의 샘플 이미지를 보면, 검정색은 테두리이므로 그 안쪽의 너비를 측정하기 위함입니다.
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_MODE, M_ENABLE, M_NULL);
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_DELTA_POS, 90, M_NULL);
MmeasSetMarker(MilStripMarker, M_BOX_ANGLE_INTERPOLATION_MODE, M_BILINEAR, M_NULL);
측정 상자의 angle을 지정합니다. 위에서도 얘기한 것과 같이 오브젝트가 좌측으로 살짝 기울어져있습니다.
M_BOX_ANLGE_MODE: angle 모드를 사용하겠다(enable) 라는 파라메터입니다.
M_BOX_ANGLE_DELTA_POS: angle의 범위를 양의 방향으로 90도까지 지정합니다.
M_BOX_ANGLE_INTERPOLATION_MODE: 보간법 알고리즘은 bilinear로 지정합니다.
MmeasSetMarker(MilStripMarker, M_WIDTH, 45, M_NULL);
MmeasSetMarker(MilStripMarker, M_WIDTH_VARIATION, 10, M_NULL);
사용자가 width의 예상 값을 지정해 줍니다. 알고리즘이 검색을 더 용이하게 도와줍니다.
M_WIDTH: 폭을 예상하는 pixel 값을 지정
M_WIDTH_VARIATION: 폭의 허용오차 pixel 값을 지정합니다.
SetMarker( )를 통해서 알 수 있듯이 Measurement 모듈은 측정하는 모듈이므로
사용자가 측정하는 오브젝트에 대한 정보를 알고 있어야 함이 중요합니다.
사용자가 marker에 대한 정보를 정확히 알려줄수록 알고리즘이 검색에 뛰어난 성능을 발휘합니다.
// 3. Find Marker
MmeasFindMarker(M_DEFAULT, MilTargetImage, MilStripMarker, M_CONTRAST);
MmeasDraw(M_DEFAULT, MilStripMarker, MilOverlay, M_DRAW_WIDTH+M_DRAW_BOX, M_DEFAULT, M_RESULT);
Marker를 검색합니다. 검색 후, 결과를 Draw 함수를 이용하여 width와 측정상자의 외곽을 그립니다.
// 4. Result
MmeasGetResult(MilStripMarker, M_WIDTH, &vWidth, M_NULL);
strWidth.Format("Width= %. 3f pixels", vWidth);
MgraText(M_DEFAULT, MilOverlay, 0, 0, (char*)(const char*) strWidth);
GetResult 함수를 이용하여 width를 얻어와서 출력합니다.
// 5. Free
MmeasFree(MilStripMarker);
할당한 marker를 해제합니다.
감사합니다.
'영상처리(Matrox Library, Frame grabber) > Matrox Library' 카테고리의 다른 글
[Matrox Imaging Library - MIL] 13. BLOB 시작하기 (0) | 2023.05.22 |
---|---|
[Matrox Imaging Library - MIL] 12 : Meas(Measurement) 샘플코드 (0) | 2023.05.22 |
[Matrox Imaging Library - MIL] 9 : Pat(Pattern Matching) 각도 설정에 대한 처리 속도 차이 (0) | 2021.06.23 |
[Matrox Imaging Library - MIL] 8 : Pat(Pattern Matching) 예제코드 분석 (0) | 2021.06.21 |
[Matrox Imaging Library - MIL] 6 : GMF(Geometric Model Finder) 예제 코드 분석 (2) | 2021.06.16 |