<

알파벳 대소문자, 숫자를 포함한 랜덤한 문자열을 생성하는 함수



출처는 StackOverflow

void gen_random(char *s, const int len)
{
	static const char alphanum[] =
		"0123456789"
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz";

	for (int i = 0; i < len; ++i) {
		s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
	}

	s[len] = 0;
}

여기에 문자 중복이 안되게끔 하거나, 특수문자를 추가하는 방법도 고려해봐야겠다.


C#에서는 FILE 핸들러로 바로 확인이 가능한데 C++는 한줄에 쓰기 번거러워 따로 함수를 만들어서 사용한다.


유니코드가 아닌 프로젝트도 있어 분기처리 해준다.



bool isExistFile(CString _strFile)
{
#ifdef _UNICODE
	return(_waccess_s(_strFile, 0) != -1);
#else
	return (_access_s(_strFile, 0) != -1);
#endif
	
}


MFC에서 ComboBox(콤보박스) 사용시 사용자가 임의적으로 항목을 수정할 수 있다.


물론 수정된 값을 받는 경우도 있지만, 해당 선택된 항목의 index값을 가져와서 쓰는경우 매개변수가 잘못되었다는 등의 오류가 발생 할 수 있다.


사용자가 수정할 항목이 아닌 경우라면 이를 ReadOnly로 바꿔줄 필요가 있다.


ReadOnly 설정은 따로 코드를 수정하는 경우도 있지만, 간단하게 해당 리소스 속성항목에서 


Type를 "Drop List"로 바꿔주면 된다.


아래는 Reference에 나와있는 Style Type별 상태

StyleWhen is list box visibleStatic or edit control
SimpleAlwaysEdit
Drop-downWhen dropped downEdit
Drop-down listWhen dropped downStatic


SI 기본 단위의 정의



SI 접두어


CFileDialog 클래스는 흔히 사용되는 파일열기, 폴더 열기 등 FileOpen 다이얼로그를 생성하는 클래스이다.

자세한 내용은 레퍼런스를 참고하자.(https://msdn.microsoft.com/ko-kr/library/dk77e5e7.aspx#cfiledialog__cfiledialog)


아래는 레퍼런스에 나와있는 CFileDialog 생성자이다.

CfileDialog는 객체 생성시에 추가로 인자값을 넣어주어야 한다.


explicit CFileDialog(
	BOOL bOpenFileDialog,  //TRUE : 파일 열기, FALSE : 다른 이름으로 저장 대화 상자
	LPCTSTR lpszDefExt = NULL,  //기본 파일 이름 확장자
	LPCTSTR lpszFileName = NULL,  //초기 파일 이름, 파일명 지정하는 edit컨트롤 기본 내용
	DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,  //대화상자 

	/*

	- OFN_EXPLOPER     윈도우 탐색기 스타일
	- OFN_ARROWMULTISELECT       파일을 한번에 여러개 선택 가능
	- OFN_CREATEPROMPT         존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 메시지 박스 출력
	- OFN_FILEMUSTEXIST     존재하지 않는 파일명을 입력할 수 없도록 함
	- OFN_HIDEREADONLY      읽기 전용 파일은 출력하지 않음
	- OFN_LONGNAMES          긴 파일 이름 포맷 지원
	- OFN_OVERWRITEPROMPT  존재하는 파일명을 입력했을 경우 덮어쓰겠냐는 메시지 박스 출력
	- OFN_PATHMUSTEXIST      이미 존재하는 디렉터리명만을 입력


	//2개 이상의 플래그를 이용하고자 하는 경우 '|' 기호로 구분하여 사용한다.
	*/
	LPCTSTR lpszFilter = NULL,  //확장자 필터
	CWnd* pParentWnd = NULL,
	DWORD dwSize = 0,
	BOOL bVistaStyle = TRUE);


****************** CFileDialog 클래스의 멤버 함수
CString GetPathName       선택된 파일의 절대 경로
CString GetFileName        선택된 파일의 이름과 확장자
CString GetFileExt            선택된 파일의 확장자
CString GetFileTitle           선택된 파일의 파일명
BOOL GetReadOnlyPref     읽기 전용 여부

POSITION GetStartPosition           다중 선택의 경우
CString GetNextPathName



******************CFileDialog 클래스의 인스턴스를 선언하고 DoModal 함수 호출

** 한개의 파일만 선택할 경우
char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
        CString strPathName = dlg.GetPathName();
}


** 여러개의 파일을 복수 선택할 경우

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

if(IDOK == dlg.DoModal())
      for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
               m_ctrlListBox.AddString(dlg.GetNextPathName(pos));



Get으로 멤버함수를 찾으면 될듯 하다..

Mil과  Mil Lite,     Active Mil 과의 차이점.??


Mil - Lite의 경우는  Matrox Frame Grabber 설치를 위한 Driver를 제공하며 기본적인 Frame Grabber기능 즉 영상획득
디스플레이 , 영상 로드, 저장이 가능한 모듈들로 구성되어 있습니다.

주로 영상을 획득하여 이미지 확인 및 이에 대한 저장을 위해 많이 사용되며, 이미지 데이타를 직접 접근하여
독자적인 프로세싱처리 및 알고리즘을 적용할 수 있습니다.

MIL의 경우에는 MIL-lite에서 제공하는 기능을 포함하며 영상처리를 위해 사용되는 알고리즘이 쉽게 사용할 수 있는 함수로
구현되어 있습니다.

즉 이미지 프로세싱  패턴 매칭   OCR  blob  Measurement등의 기능을 함수로써 제공하므로 누구나 쉽게 사용하실 수
있도록 구성.

Mil은 우리가 Visual C++ 환경에서  c언어를 사용하여 프로그래밍 할 수 있도록 라이브러리가 구성되어 있습니다.

Active Mil은 Active X 사용하는 것으로써 Visual basic과 visual c++환경에서 개발이 가능하며 mil에서 사요하는
모듈들로 컨트롤이 구성되어 있습니다.

즉 MIL에서는 사용하기 위한 모듈들에 대한 선언 및 초기화 작업에 대한 작업을 config을 통해 설정을 해 주는 반면에
active mil의 경우는 active x control로 모든 모듈들이 구성되어 있어 컨트롤을 form 및 리소스에서 원하는 컨트롤을 선택하고 여기에 대한 초기화를 속성창을 통해 설정을 합니다.

지원하는 기능은 동일하며 다만 사용하는 함수의 표현방식이 개발환경에 따라 다릅니다. 




■ Mil workspace 생성을 위한 세팅하는 방법


MIL을 이용한 프로그램을 실행하기 위해서는

1. Tool / option 에서  Directories tab에서  라이브러리,  인클루드 파일에 매트록스에 폴더를 넣어준다.

2. 그런후 컴파일을 하면  workspace 가 생성되면서,  에러가 발생한다.

이 에러경우는 각 모듈에 대한 라이브러리가 링크되지 않아서 발생하는 에러이므로 다음과 같은 설정을 한다.

 -  project / setting tab의  link의 프로그램에서 사용되는 library modules을 삽입해 주시면 됩니다.  
  - 예를들면 mblob.c 를 사용할 경우 기본적으로  mil.lib, milblob.lib,  millimlib 의 라이브러리 첨가해주시면 됩니다.

3. 그리고 다시 컴파일을 한다.




■ MIL 기본 소스구조.

Mil은 매트록스에서 나오는 프레임 Grabber를 사용하기 위해서 필요한 일종의 라이브러리.

Mil 과 Mil-Lite의 두 종류로 나뉘어 있으며, Mil은 Mil-Lite에 들어있지 않은 Image-Processing관련 함수들이
포함되어 있습니다.

Mil 처음하시는 분들을 위해서 간단한  Grab예제로 설명



/*  Mil함수들이 정의되어 있는 함수로써 include해야 됩니다. */

#include< mil.h >
#include< stdio.h >

void main(void)
{
    /*  Mil에서 각 개체들을 다루는 data type으로서 아래와 같은 항목들을 지정합니다. */
 
    MIL_ID MilApplication;   // 응용프로그램 ID
    MIL_ID MilSystem;       //  Frame Grabber의 ID
    MIL_ID Mildisplay;        //  디스플레이를 위한 ID
    MIL_ID MilDigitizer;       //  digitizer를 위한 ID
    MIL_ID MilImage;          // Image buffer를 위한 ID


    /*  응용프로그램에서 각각 ID들을 기본적인 설정으로 할당합니다. */

    MappAllocDefault( M_SETUP, &MilApplication, & MilSystem, &MilDisplay, &MilDigitizer, &MilImage );

    /*  모니터에 MilImage의 내용을 디스플레이 하기 위한 설정을 한다.  */
    MdispSelect(MilDigitizer, MilImage);

     /*  카메라에서  Grb하여 MilImage에 저장합니다. */
    MdigGrab( MilDigitizer, MilImage );


     printf("An Image has been Grabbed\n");
 
     getchar();

    /*  처음에 할당한 ID들을 해제 합니다. */

    MappFreeDefault( MilApplication,  MilSystem, MilDisplay, MilDigitizer, MilImage );


}



위에서 각 ID들을 할당하고 해제시켜주는 것은 모든 응용프로그램에서 동일하다.

다만 각 경우에 따라 각 ID들을 따로 할당시키고 각각해제할 수 있습니다.

각각의 MIL_ID를 할당 및 해제하는 함수는 다음과 같다.

MilApplication - MappAlloc , MappFree

MilSystem - MsysAlloc,  MsysFree

MilDisplay - MdispAlloc,  MdispFree

MilDigitizer - MdigAlloc,  MdigFree

MilImage -    MbufAlloc2d , MbufAllocColor, MbufFree,  etc....



여기서 주의 할 점은 할당 해제시 순서이다.

할당시에는  
  MappAlloc  -> MsysAlloc  -> MdigAlloc  -> MdispAlloc - > MbufAlloc 


해제시에는  
 MbuffFree  ->  MdispFree  -> MdigFree ->  MsysFree  -> MappFree




■ MilImage를 파일로 저장하거나 불러오는 방법

MIL에서 기본으로 사용하는 Image Format은  *.mim형태의 tiff형식의 파일입니다.

따라서  MbufLoad와  MbufSave를 다음과 같이 사용하시면  mim파일로 저장 또는 불러오기가 가능.

MbufLoad( "load.mim", MilImageLoaded );
MbufSave("save.mim"  MilImagfeSaved);

그러나 일반적으로 사용하는 포맺인 jpeg나 tiff, raw등의 이미지 파일 포맺은 다음의 함수를 사용하여 저장 불러오기가능.

MbufImport( "sample.jpg", M_JPEG_LOSY, M_RESTORE, MilSystem, &MilImage);
MbufExport( "sample.tif",  M_TIFF, MilImage );

그리고 Image의 sequence를 avi파일로도 저장이 가능한다. 이때는 
MbufImprtSequence,  MbufExportSequence 함수를 이용하면 된다.




■ MIL을 이용한 프로세싱 시간 측정.

프로그램을 직접 작성하다 보면 각 부분들은 성능을 측정하고, 디버깅을 위해 Timer가 필요한 경우가 많다.
이럴경우 Mil에서 제공하는 MappTimer를 사용하면 된다.,

  /* Return되는 시간값의 단위는 sec(초) 이고 따라서 보통 Time * 1000(ms)로 사용합니다. */


double Time;
MappTimer(M_TIMER_RESET, M_NULL);

/*이곳에 시간측정 대상이 되는 프로세스가 들어간다.*/

MappTimer(M_TIMER_READ, &Time);

+ Recent posts