프레임 심도란,

  하나의 scean(장면) 즉 영상 이미지에서 초점을 평이하게 전체적으로 맞추면 밋밋한 영상이 되나,

전쟁영화에서 처럼 프레임 심도를 다양하게 구성하면 사실적인 표현이 가능하다.

즉 실제 사람의 눈으로 현실을 바라보는 듯한 영상이랄까?

 

하나의 영상에 대하여 여러 프레임 방식을 구성하고, 각 프레임마다는 초점되는 대상이 하나씩 존재하게 된다. 그렇게 함으로써 영상 심도를 높여 사실적인 표현이 가능해지게 된다.

 

하기 내용 발췌..

 

http://inomsang.blog.me/90180247897

'영상처리 > 기타' 카테고리의 다른 글

렌즈 배율별 광량차이  (0) 2014.10.13
Meteor2/4와 Meteor2/MC 차이점.  (0) 2014.01.17

동일 물체를 고배율과 저배율로 리뷰해보면, 고배율이 어둡게 보이는것을 알 수 있다.

 

이유는 광량(光量)에 있다.

눈으로 보는 시야(Field of View)는 언제나 일정하지만

고배율로 물체를 보게되면, 더 작은 부위 즉 빛을 발하는 물체의 부위가 작은 부분을

저배율때와 같은 크기로 확대하는 것이기 때문에 원래 포함하고 있는

빛의 양도 적기 때문에 고배율일수록 취득되는 영상은 어둡게 된다.


 

 

== 기타 네이버 답변글 ==

광학현미경은 작은 물체를 렌즈를 통해 크게 확대하여 보는 기구입니다.
고배율과 저배율을 비교해보면 고배율일수록 더 적은 물체를 확대하여 보는 것입니다.

따라서 시야의 범위는 고배율일 수록 더 적습니다. 더 적은 부분을 확대하기 때문이죠.

이런 시야의 범위가 적으므로 렌즈를 통과하는 전체 빛의 양이 저배율에 비해 적습니다.

적어지는 빛의 양 때문에 고배율로 갈수록 사야의 밝기는 어두워집니다

 

'영상처리 > 기타' 카테고리의 다른 글

프레임 심도의 중요성 (영상심도)  (0) 2014.11.06
Meteor2/4와 Meteor2/MC 차이점.  (0) 2014.01.17

 

 

MIL 영상을 bmp로 취득 및 저장하는 방법 정리.

 

 

.h 선언

CDC                           *mp_memory_dc;

const int LIVE_IMAGE_PIXEL_SIZE_X = 1296;

const int LIVE_IMAGE_PIXEL_SIZE_Y = 976;

 

 

Cpp 생성부

mp_memory_dc       = new CDC();

 

=========================================================================================

           HDC h_dc = mp_memory_dc->GetSafeHdc();

 

           unsigned char *p_data = NULL;

           int width  = LIVE_IMAGE_PIXEL_SIZE_X;

           int height = LIVE_IMAGE_PIXEL_SIZE_Y;

 

           ////////////////////////////////////////

           BITMAPINFO l_bmp_info;

           l_bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

           l_bmp_info.bmiHeader.biWidth = width;

           l_bmp_info.bmiHeader.biHeight = height * -1;

           l_bmp_info.bmiHeader.biPlanes = 1;

           l_bmp_info.bmiHeader.biBitCount = 24;

           l_bmp_info.bmiHeader.biCompression = BI_RGB;

           l_bmp_info.bmiHeader.biSizeImage = (((width * 24 + 31) & ~31) >> 3) * height;

           l_bmp_info.bmiHeader.biXPelsPerMeter = 0;

           l_bmp_info.bmiHeader.biYPelsPerMeter = 0;

           l_bmp_info.bmiHeader.biClrImportant = 0;

           l_bmp_info.bmiHeader.biClrUsed = 0;

          

           HBITMAP h_bitmap = ::CreateDIBSection(h_dc, &l_bmp_info, DIB_RGB_COLORS, (void **)&p_data, NULL, NULL);

           HDC h_mem_dc = ::CreateCompatibleDC(h_dc);

           HBITMAP h_old_bitmap = (HBITMAP)::SelectObject(h_mem_dc, h_bitmap);

 

           unsigned char *pTemp;

           pTemp = new unsigned char[width*height*3];

 

  // MIL 함수에서 현재 영상을 pTemp에 담음.

MbufGetColor(m_MilIdImg_Live, M_PACKED+M_BGR24   , M_ALL_BANDS, pTemp);

 

           memcpy(p_data, pTemp, width*height*3);

 

           RECT rect;

           rect.right = LIVE_IMAGE_PIXEL_SIZE_X;

           rect.bottom = LIVE_IMAGE_PIXEL_SIZE_Y;

           rect.left = 50;

           rect.top = LIVE_IMAGE_PIXEL_SIZE_Y-50;

 

           ::SetTextColor(h_mem_dc, RGB(255,0,0));

           ::DrawText(h_mem_dc, szOverlayText,strlen(szOverlayText), &rect, DT_LEFT);

           memcpy(pTemp, p_data, width*height*3);

          

// 저장된 pTemp 영상 이런저런 처리 후 MIL에 다시 집어넣기

if(pTemp)

{

           MbufPutColor(m_MilIdImg_Grab,M_PACKED+M_BGR24   , M_ALL_BANDS, pTemp);

           MbufCopyColor2d(m_MilIdImg_Grab,         m_MilIdImg_ForJudge, M_ALL_BANDS,

                     0, 0, M_ALL_BANDS, m_nLiveImageSizeX,0,m_nLiveImageSizeX, m_nLiveImageSizeY);

}

else

{

           MbufCopy(m_MilIdImg_Live, m_MilIdImg_Grab);

           MbufCopyColor2d(m_MilIdImg_Grab,         m_MilIdImg_ForJudge, M_ALL_BANDS,

                     0, 0, M_ALL_BANDS, m_nLiveImageSizeX,0,m_nLiveImageSizeX, m_nLiveImageSizeY);

}

          

           delete [] pTemp;

 

           ::SelectObject(h_mem_dc, h_old_bitmap);

           ::DeleteObject(h_bitmap);

           ::DeleteDC(h_mem_dc);

=========================================================================================

 

Mil 9.0 MdigFocus 활용 방법입니다.

Mil 9.0 Full version을 사용해야 MdigFocus 기능 사용이 가능합니다.

 

===================================================================================================

MIL_INT Focus_Indicator_Value; // Focus_Indicator_Value (이미지 초점 품질 척도값).

 

for (MIL_INT i= FocusMinPosition; i<=FocusMaxPosition; i++)
{

j++;

 

imageLoad((int) i); // 이미지를 불러온다

 

MdigFocus( // evalution 값만 불러와서 출력한다.

M_NULL,
MilImage,
M_DEFAULT,
NULL,
NULL,
FocusMinPosition,
i,
FocusMaxPosition,
M_DEFAULT,
M_EVALUATE,
&Focus_Indicator_Value

);

}

 


 

 

하기 소스 중 붉은 색 부분 참조해주세요.

int CLiveCamera::m_fnCamInit(_ST_INITDESC_LIVECAM *pInitDesc)

{

..............

//Allocate
char szDCFFile[MAX_PATH] = {0,};
sprintf(szDCFFile, "C:\\SolXCL_FD202SCL_c_24bit_72_16d.dcf");

MdigAlloc(m_MilIdSys, M_DEV0, (MIL_TEXT_PTR)szDCFFile, M_DEFAULT, &m_MilIdDig);

if(m_MilIdDig == M_NULL)
{
if(m_MilIdImg) { MbufFree(m_MilIdImg); m_MilIdImg = NULL; }
if(m_MilIdDig) { MdigFree(m_MilIdDig); m_MilIdDig = NULL; }
if(m_MilIdDisp){ MdispFree(m_MilIdDisp); m_MilIdDisp = NULL; }
if(m_MilIdSys) { MsysFree(m_MilIdSys); m_MilIdSys = NULL; }
if(m_MilIdApp) { MappFree(m_MilIdApp); m_MilIdApp = NULL; }
return -1;
}

디지타이저 생성 후 옵션에 따라 선택...

//////////////////////////////////////////////////////////////
//MdigControl(m_MilIdDig, M_GRAB_DIRECTION_X, M_REVERSE);

//MdigControl(m_MilIdDig, M_GRAB_DIRECTION_Y, M_REVERSE);
//////////////////////////////////////////////////////////////


//a MdigControl(m_MilIdDig,M_GRAB_MODE,M_ASYNCHRONOUS); //
반드시 M_ASYNCHRONOUS
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Allocate Buffer
// long band = MdigInquire(m_MilIdDig, M_SIZE_BAND, M_NULL);


MbufAllocColor(m_MilIdSys, 3, m_nGrabSizeX, m_nGrabSizeY, 8 + M_UNSIGNED, M_IMAGE + M_DISP + M_GRAB + M_PROC, &m_MilIdImg);

MbufAllocColor(m_MilIdSys, 3, m_nGrabSizeX, m_nGrabSizeY, 8 + M_UNSIGNED, M_IMAGE + M_DISP + M_GRAB + M_PROC, &(m_MilIdImgField[0]));
MbufAllocColor(m_MilIdSys, 3, m_nGrabSizeX, m_nGrabSizeY, 8 + M_UNSIGNED, M_IMAGE + M_DISP + M_GRAB + M_PROC, &(m_MilIdImgField[1]));

....................

}

 

// Allocate a MIL application.
MIL.MsysAlloc("M_DEFAULT", MIL.M_DEFAULT, MIL.M_DEFAULT, ref _milSysId);

// Allocate a MIL display.
MIL.MdispAlloc(_milSysId, MIL.M_DEFAULT, "M_DEFAULT", MIL.M_WINDOWED, ref _milDispId);

// License 정보를 확인한다.

// 취득데이터 : License가 있는경우 0 이외의 값이 리턴.

License가 없는경우 0 값이 리턴.
MIL_INT test = MIL.MsysInquire(_milSysId, MIL.M_LICENSE_MODULES);

 

C# 영상처리 소스 (panel에 출력)

picture box에 출력하니 오버랩이 심햇다.

하지만. panel에 출력하니 그러한 현상이 사라졌다. 아싸ㅓ~!!!

 

C type의 소스를 C#으로 변경중 하기 HookFunction을 어떻게 처리해야 하는지 고민하다..

알게된 사실... 2번째 인자를 이벤트로 처리해서 MappHookFunction 발생시 연결된

이벤트가 호출되도록 하면 된다는것..

 

MIL.MappHookFunction(MIL.M_ERROR_CURRENT, DisplayDrv_eDisplayErrorExt, MIL.M_NULL);

 

상기 함수의 원형은 이렇다.

///////////////////////////////////////////////////////////////////////////

void MappHookFunction(

MIL_APP_HOOK_FUNCTION_PTR HookHandlerPtr,

)

///////////////////////////////////////////////////////////////////////////

여기서, MIL_APP_HOOK_FUNCTION_PTR 의 원형은 이렇다.

///////////////////////////////////////////////////////////////////////////

namespace Matrox.MatroxImagingLibrary
{
public delegate MIL_INT MIL_APP_HOOK_FUNCTION_PTR
(

MIL_INT HookType,

MIL_ID EventId,

IntPtr UserDataPtr );

}

///////////////////////////////////////////////////////////////////////////

즉, delegate로 선언되어있기때문에, event로 인스턴스 선언하고 event 등록시키면 된다.

요렇게..

선언.

public event MIL_APP_HOOK_FUNCTION_PTR eDisplayErrorExt;

처음 로딩되는 부분에서 이벤트 등록

eDisplayErrorExt += new MIL_APP_HOOK_FUNCTION_PTR(DisplayDrv_eDisplayErrorExt);

실제 사용하는 부분

// user-defined function to a specified application event

MIL.MappHookFunction (

MIL.M_ERROR_CURRENT,

DisplayDrv_eDisplayErrorExt,

MIL.M_NULL );

hook 발생시 실행되는 함수 원형

// MIL Application Hooking Function(event-function)
MIL_INT DisplayDrv_eDisplayErrorExt(MIL_INT HookType, MIL_ID EventId, IntPtr UserDataPtr) {
StringBuilder szbFunction = new StringBuilder(MIL.M_ERROR_MESSAGE_SIZE);
// M_CURRENT_FCT : Returns the opcode associated with the last function

called, when it returns an error.
MIL.MappGetHookInfo(EventId,

MIL.M_MESSAGE + MIL.M_CURRENT_FCT,

szbFunction );

return MIL.M_NULL;

}

MIL 9.0 사용하다가 발생된 에러인데,,

원인은 이렇다.

 

현재 MIL 9.0 설치 PC: Matrox MIL 9.0 Lite 64bit

개발 환경 : VS2010에서 C#으로 MIL 9.0 Class Library 형태로 제작(flatform: any)

MIL 9.0 Library 사용 Application 빌드 환경 : X86..

--> X86 환경으로 되어있어 하기와 같은 문제가 발생하였다.

 

 

해서 X86부분을 AnyCpu 로 변경하니 정상 동작되었다.

 

단 MIL 9.0 32bit 버젼이면 상관없을 듯 하다.

'영상처리 > MIL' 카테고리의 다른 글

C# 영상처리 소스 (panel에 출력)  (1) 2014.01.17
C# MIL MappHookFunction 처리하기  (0) 2014.01.17
Bayer Filter 내용  (1) 2014.01.17
2중 선형 보간법(bilinear Interpolation)  (0) 2014.01.17
3CCD Camera 사용  (0) 2014.01.17

하기 사이트에서 참고함.

발췌: http://blog.naver.com/suyguy17?Redirect=Log&logNo=138603366

+ Recent posts