[Matrox Imaging Library - MIL] 11 : Meas(Measurement) 샘플코드
본문 바로가기

영상처리(Matrox Library, Frame grabber)/Matrox Library

[Matrox Imaging Library - MIL] 11 : Meas(Measurement) 샘플코드

Measurement의 Stripe Marker를 이용하여 측정을 어떻게 하는지 알아보겠습니다.

 

 

 

Measurement 샘플 코드

아래의 샘플 이미지에서 노란색으로 표시된 부분을 측정해 보도록 하겠습니다.

Measurement 모듈을 이용해 측정한 결과 이미지
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를 해제합니다.

 

감사합니다.