• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'Programming'에 해당되는 글 147건

  • 2013.11.11 UpdateData() 함수에 대한것들
  • 2013.11.07 [Function] IplImage 에 한글text 삽입하기 1
  • 2013.11.07 std::string --> CString 변환함수
  • 2013.11.07 유효숫자 만큼 나타내기
  • 2013.11.07 char* <--> CString 변환 함수
  • 2013.08.08 DC -> IplImage로 전환
  • 2013.08.06 WM_USER 에 대하여.
  • 2013.08.06 Dialog based program 에서 Menu 만들기.
  • 2013.08.06 Device Context ( DC ) 1
  • 2013.07.03 GetDlgItem() 함수를 이용하기
  • 2013.07.01 Memory Leaks 어디서 누수가 일어나는지 잡아보자..
  • 2013.06.14 CFileDialog 다중파일 선택하기
  • 2013.06.07 #define 에 관한 내용
  • 2013.05.06 cv::Mat Class 사용법
  • 2013.04.30 MFC TabControl 사용법 2
  • 2013.04.29 OpenCV 주요함수
  • 2013.04.29 cvHoughLines2 함수를 이용한 직선 검출
  • 2013.04.26 OpenCV 를 이용하여 동영상 재생하기.
  • 2013.04.02 MFC Picture Control 에 BMP 파일 출력하기 1
  • 2013.04.02 MFC 에서 wav 파일 재생하기 1

UpdateData() 함수에 대한것들

Programming/C, C++, MFC 2013. 11. 11. 21:35




1. 언제 사용할까?

   - UpdateData( ) 함수는 말 그대로 데이터를 업데이트 할 때 사용하는 함수

 

2. 사용 방법

   - 컨트롤에 있는 값을 변수로 넣어 갱신하고 싶을 때에는 UpdateData(TURE) 사용

   - 변수에 있는 값을 컨트롤에 넣어 갱신하고 싶을 때에는 UpdateData(FALSE) 사용

 

3. 어떻게 저렇게 쓸수 있게 되는 걸까?

   - 그냥 무조건 갱신되는게 아니다!

      전제 조건으로 어떤 변수가 어떤 컨트롤과 연결되어 있는지에 대하여 먼저 이야기를 해야지 알 수 있다.

      그래서 DDX(DoDataExchange)에 보면 어떤 컨트롤 ID가 어떤 변수와 연결되어져 있는지 미리 선언해 놓았다.

      그래서 UpdateData 함수가 호출되면 서로 간의 값 교환이 일어 난다.
      단, 매개변수가 TRUE면 컨트롤의 값이 변수로 가고, FALSE면 변수의 값이 컨트롤로 가게 되는 것이다.

 

4. UpdateData(TRUE)를 언제 쓸까?

   - OK 버튼과 Cancel 버튼을 생각해 보자!

   - 윈도우에서 제어판으로 세팅을 할 경우에 여러 가지 값들을 막 조작하다가 저장할 꺼면 확인(OK) 버튼을 누르고,
      그렇지 않을 경우에는 취소(Cancel) 버튼을 누르게 된다. 이때, OK 버튼을 눌렀을 경우 다이얼로그에 기록된 데이터를
      실제 데이터로 사용하기 때문에 그 값에 의하여 세팅이 변경 되지만, Cancel 버튼을 눌렀을 경우에는 다이얼로그에
      있던 값을 저장하지 않은 채 그냥 닫아 버린다. 따라서 이때는 OK 버튼을 눌렀을 경우 UpdateData(TRUE) 함수를 수행한다.

 

5. UpdateData(FALSE)를 언제 쓸까?

   - 새로운 Dialog 박스가 뜰 때 컨트롤 안에 값들이 미리 채워져 있다!

   - 프로그램에서 뭔가 버튼을 눌러서 새로운 Dialog 박스 창을 화면에 뛰울 경우에는 이미 값들이 들어 있다.

      예를 들어 해상도 변경을 하려고 제어판에서 디스플레이 속성 창을 열어 보면 현재 해상도가 나타나져 있다.

      이런 값들은 이미 데이터로 어딘가에 존재하는데 그 데이터를 불러와서 화면에 표시해 주는 것이다.

      따라서 새로운 대화상자(Dialog)가 열릴 때면 UpdateData(FALSE)를 수행해 주면 된다.

 

번외 : 보통 DDX 밑에 보면 BEGIN_MESSAGE_MAP이 쓰여져 있는데,

         이게 바로 컨트롤에 대하여 어떤 이벤트가 발생할 경우 어떤 함수가 실행되는지에 대하여 기술해 놓은 것이다.

         예를 들어 ON_BTN_CLICKED(IDC_BTN_SET, OnBtnSet) 이란 메시지가 있다면,

         세팅을 위한 버튼을 클릭하였을 경우 OnBtnSet이라는 함수가 실행되어지도록 연결지어 둔 것이다.

         컴퓨터는 안 가르쳐 주면 지 스스로 대충 이거겠지~ 라는 판단을 할 수 없으므로,
         사용자가 처음에 미리 잘 가르쳐 주지 않으면 어벙하게 동작할 수 있으므로 이런 점을 유의해야 한다.

         마우스 Up, Down이나  키보드 입력등의 이벤트 처리시 맵에서 처리한다.

[출처] http://blog.naver.com/meelong0/140072025818

[출처] MFC_UpdateData(TRUE) 와 UpdateData(FALSE) 사용|작성자 titan21


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

프로그램 구동 속도 를 줄이는 방법!  (0) 2013.11.20
LPCSTR / LPCTSTR / const char* / CString 등등 문자열 형  (0) 2013.11.11
std::string --> CString 변환함수  (0) 2013.11.07
유효숫자 만큼 나타내기  (0) 2013.11.07
char* <--> CString 변환 함수  (0) 2013.11.07
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

[Function] IplImage 에 한글text 삽입하기

Programming/OpenCV 2013. 11. 7. 20:50




//========= header 에 추가 =========================


void setPutText( IplImage* src_image, IplImage* dst_image, char* text, CvPoint textPos, CvScalar color);

HBITMAP setTextToBitmap( char* text, CvScalar color);

IplImage* setBitmapToIplImage( HBITMAP hBitmap );



//========== 소스코드 ===============================



void CbrailleDlg::setPutText(IplImage* src_image, IplImage* dst_image, char* text, CvPoint textPos, CvScalar color)

{

// 명암도 영상에 대한 처리는 안함 칼라만 처리 일단..


if( src_image->nChannels != 1 )

cvCopy( src_image, dst_image );


int width = src_image->width;

int height = src_image->height;


if( (textPos.y > src_image->height) || (textPos.x > src_image->width) )

{

cvCopy( src_image, dst_image );

}


CvScalar var = {0,0,0,0};

HBITMAP hBitmap = setTextToBitmap(text, color);

IplImage* text_image = setBitmapToIplImage( hBitmap );


for( int nRow = textPos.y; nRow<(textPos.y + text_image->height); nRow++)

{

for( int nCol = textPos.x; nCol<(textPos.x + text_image->width); nCol++)

{

if( nRow >= height || nCol >= width) continue;

var = cvGet2D(text_image, nRow-textPos.y, nCol-textPos.x);


if( var.val[0] == color.val[0] && var.val[1] == color.val[1] && var.val[2] == color.val[2] )

cvSet2D(dst_image, nRow, nCol, var);

}

}


free(text_image->imageData);

cvReleaseImage( &text_image );

DeleteObject( hBitmap );

}



HBITMAP CbrailleDlg::setTextToBitmap( char* text, CvScalar color)

{

int textLength = (int)strlen(text);


if( textLength <= 0 ) return NULL;


HDC hTextDC = CreateCompatibleDC(NULL);


HFONT hOldFont = (HFONT)SelectObject( hTextDC, (HFONT)GetStockObject(SYSTEM_FONT) );

HBITMAP hDstBMP = NULL;


RECT textArea = {0, 0, 0, 0};


DrawText(hTextDC, (LPCTSTR)text, textLength, &textArea, DT_CALCRECT);


if( (textArea.right > textArea.left) && (textArea.bottom > textArea.top) )

{

BITMAPINFOHEADER bitmapInfoHeader;


memset( &bitmapInfoHeader, 0x0, sizeof(BITMAPINFOHEADER) );


void* lpvBits = NULL;


bitmapInfoHeader.biSize = sizeof(bitmapInfoHeader);

bitmapInfoHeader.biWidth = textArea.right-textArea.left;

bitmapInfoHeader.biHeight = textArea.bottom-textArea.top;

bitmapInfoHeader.biPlanes = 1;

bitmapInfoHeader.biBitCount = 32;

bitmapInfoHeader.biCompression = BI_RGB;


hDstBMP = CreateDIBSection( hTextDC, (LPBITMAPINFO)&bitmapInfoHeader, 0, (LPVOID*)&lpvBits, NULL, 0 );


HBITMAP hOldBMP = (HBITMAP)SelectObject( hTextDC, hDstBMP );


if( hOldBMP != NULL)

{

int TEXT_RED = (int)color.val[2];

int TEXT_GREEN = (int)color.val[1];

int TEXT_BLUE = (int)color.val[0];


SetTextColor( hTextDC, RGB(TEXT_RED, TEXT_GREEN, TEXT_BLUE) ); //text color


SetBkColor( hTextDC, 0x00EFFEFF ); //Background color


SetBkMode( hTextDC, OPAQUE ); // 투명


DrawText( hTextDC, (LPCTSTR)text, textLength, &textArea, DT_NOCLIP);

}

::SelectObject( hTextDC, hOldBMP );

}

::SelectObject( hTextDC, hOldFont );


if( hTextDC) { ::DeleteDC( hTextDC ); }

if( hOldFont) { ::DeleteObject( hOldFont ); }


return hDstBMP;

}



IplImage* CbrailleDlg::setBitmapToIplImage( HBITMAP hBitmap )

{

BITMAP bitmap;


GetObject( hBitmap, sizeof( BITMAP ), (LPSTR)&bitmap );


int nChannels = (bitmap.bmBitsPixel == 1)? 1: bitmap.bmBitsPixel*0.125;

int depth = (bitmap.bmBitsPixel == 1)? IPL_DEPTH_1U : IPL_DEPTH_8U;


IplImage* mImage = cvCreateImageHeader( cvSize(bitmap.bmWidth, bitmap.bmHeight), depth, nChannels );


mImage->imageData = (char*)malloc(bitmap.bmHeight * bitmap.bmWidth * nChannels * sizeof(char) );


memcpy(mImage->imageData, (char*)(bitmap.bmBits), bitmap.bmHeight * bitmap.bmWidth * nChannels );


cvFlip( mImage, mImage, 0 );


return mImage;

}


//================사용 예 ==========================

CString str;

str.Format( _T("한글") );

setPutText( &IplImage(m_Image), &IplImage(m_Image), (LPSTR)(LPCTSTR)str, cvPoint(10,10), CV_RGB(255,255,100) ); 

저작자표시 비영리 (새창열림)

'Programming > OpenCV' 카테고리의 다른 글

[Function] HoG Destriptor in OpenCV  (0) 2014.01.27
[Function] 영상을 회전 시키기  (0) 2014.01.23
DC -> IplImage로 전환  (0) 2013.08.08
cv::Mat Class 사용법  (0) 2013.05.06
OpenCV 주요함수  (0) 2013.04.29
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

std::string --> CString 변환함수

Programming/C, C++, MFC 2013. 11. 7. 20:49




string string2CString(CString cstr)

{

string sstring;


CT2CA pszAnsiString (cstr);

string stdConvert(pszAnsiString);

sstring = stdConvert;


return sstring;

}

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

LPCSTR / LPCTSTR / const char* / CString 등등 문자열 형  (0) 2013.11.11
UpdateData() 함수에 대한것들  (0) 2013.11.11
유효숫자 만큼 나타내기  (0) 2013.11.07
char* <--> CString 변환 함수  (0) 2013.11.07
WM_USER 에 대하여.  (0) 2013.08.06
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

유효숫자 만큼 나타내기

Programming/C, C++, MFC 2013. 11. 7. 20:46




double round(double v)

{

double dOverDot  = double(int(v));

double dUnderDot = v - dOverDot;

if(dUnderDot > 0)

{

if( dUnderDot >= 0.5 ) dOverDot += 1.0;

}

else if(dUnderDot < 0)

{

if( dUnderDot <= -0.5 ) dOverDot -= 1.0;

}

return dOverDot;

}


double round_to_digits(double value, int digits)

{

double factor = pow(10.0, digits - ceil(log10(fabs(value))));

return round(value * factor) / factor;   

}

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

UpdateData() 함수에 대한것들  (0) 2013.11.11
std::string --> CString 변환함수  (0) 2013.11.07
char* <--> CString 변환 함수  (0) 2013.11.07
WM_USER 에 대하여.  (0) 2013.08.06
Dialog based program 에서 Menu 만들기.  (0) 2013.08.06
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

char* <--> CString 변환 함수

Programming/C, C++, MFC 2013. 11. 7. 20:45




CString char2CString(char* inp)

{

int len;

CString str;

BSTR buf;


len = MultiByteToWideChar(CP_ACP, 0, inp, (int)strlen(inp), NULL, NULL);

buf = SysAllocStringLen(NULL, len);

MultiByteToWideChar(CP_ACP, 0, inp, (int)strlen(inp), buf, len);

str.Format(_T("%s"), buf);


return str;

}



char* CString2char(CString& str)

{

long len = str.GetLength();

len = len*2;

char* szTemp = new char[len+1];

memset(szTemp, 0, len+1);

USES_CONVERSION;

strcpy(szTemp, T2A(str));


return szTemp;

}


CString -> char* 위 경우 메모리 릭이 발생..


CString str = "내용";

char* ch = NULL;

ch = str.GetBuffer(str.GetLength());  / ch = (LPSTR)(LPCSTR)str;

로 가능하다는데 후자는 잘 안됐던거 같은데... 나중에 확인해보자.


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

std::string --> CString 변환함수  (0) 2013.11.07
유효숫자 만큼 나타내기  (0) 2013.11.07
WM_USER 에 대하여.  (0) 2013.08.06
Dialog based program 에서 Menu 만들기.  (0) 2013.08.06
Device Context ( DC )  (1) 2013.08.06
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

DC -> IplImage로 전환

Programming/OpenCV 2013. 8. 8. 13:49





화면에 무언갈 띄운다던가. 선을그리고 텍스트를 그리고


사각형을 그리고 원을그리고 이미지를 올리고 뭐 등등 이러한 여러가지 작업들을


DC 에 벌려 놓은 다음 그 DC를 파일로 저장 한다거나 IplImage로 혹은 cv::Mat 으로 


가져와서 다른 작업을 하고싶다거나.. 할때 변환을 해주는 함수.


해당 DC의 CDC 를 파라미터로 넘겨주면 해당 DC를 IplImage로 반환 해준다.




이렇게 사각형 박스안에 그림을 그리고 나서 


DCtoIplImage 함수를 불러주면 



뿅 하고 IplImage를 반환 해준다.


이를 확인하기 위해 NamedWindow를 통해 화면에 나타낸 것.



이런 작업을 위한 함수.



IplImage* CtestDlg::DCtoIplImage(CDC* pDC)

{

CRect rect;

    pDC->GetWindow()->GetClientRect(rect);

    int cx = rect.right - rect.left;

    int cy = rect.bottom - rect.top;

    if(cx <= 0 || cy <= 0) return NULL;

    HDC hMemDC;

    hMemDC = CreateCompatibleDC(pDC->m_hDC);

    BITMAPINFO    bmi;

    BITMAPINFOHEADER* bmih = &(bmi.bmiHeader);

    LPVOID        pBits;

    HBITMAP        hBitmap;

    ZeroMemory(bmih, sizeof(BITMAPINFOHEADER));

    bmih->biSize        = sizeof(BITMAPINFOHEADER);

    bmih->biBitCount    = 24;

    bmih->biWidth        = cx;

    bmih->biHeight        = cy;

    bmih->biPlanes        = 1;

    hBitmap = CreateDIBSection(pDC->m_hDC, &bmi, DIB_RGB_COLORS, (LPVOID*)&pBits, NULL, 0);

    SelectObject(hMemDC, hBitmap);

    BitBlt(hMemDC, 0, 0, cx, cy, pDC->m_hDC, rect.left, rect.top, SRCCOPY);

    DeleteDC(hMemDC);

   

    hMemDC = NULL;

    bool bMustRelease = false;

    const int nDepth = IPL_DEPTH_8U;

    const int nChannels = 3;

    

    if(hMemDC == NULL)

    {

        hMemDC = ::GetDC(NULL);

        bMustRelease = true;

    }

    IplImage* img = NULL;

    if(GetDIBits(hMemDC, hBitmap, 0, 0, NULL, &bmi, DIB_RGB_COLORS))

    {

        int nHeight = (bmih->biHeight > 0) ? bmih->biHeight : -bmih->biHeight;

        img = cvCreateImage(cvSize(bmih->biWidth, nHeight), nDepth, nChannels);

        img->origin = (bmih->biHeight > 0);

        bmih->biBitCount = (WORD)(img->nChannels * 8);

        bmih->biCompression = BI_RGB;

        GetDIBits(hMemDC, hBitmap, 0, nHeight, img->imageData, &bmi, DIB_RGB_COLORS);

    }

    if(bMustRelease) ::ReleaseDC(NULL, hMemDC);


    DeleteObject(hBitmap);

    return img;

}

저작자표시 비영리 (새창열림)

'Programming > OpenCV' 카테고리의 다른 글

[Function] 영상을 회전 시키기  (0) 2014.01.23
[Function] IplImage 에 한글text 삽입하기  (1) 2013.11.07
cv::Mat Class 사용법  (0) 2013.05.06
OpenCV 주요함수  (0) 2013.04.29
cvHoughLines2 함수를 이용한 직선 검출  (0) 2013.04.29
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

WM_USER 에 대하여.

Programming/C, C++, MFC 2013. 8. 6. 19:29





1. WM_USER 란?


뭐 일단 이름에서 보이듯이 Window Message 이다.

근데 이 메세지가 뭐냐 하니 

사용자가 메세지를 전달하고 싶을경우가 분명히 있을거란 말이지.

근데 사용자가 아무렇게나 뭐 예를들어 #define message 1004

이렇게 정의하고 쓸수 있지.. 암 근데 이게 시스템에서 이미 쓰는 주소라면 문제가 되는거지

그래서 미리 시스템에서 사용자가 Window Message로 사용할수 있게 예약하둔 공간을 가리키는 포인터다.


2. WM_USER의 범위는?


이건 뭐 일단 질문이 조금 이상한데 

시스템에서 사용자의 메세지 사용을 위해 0x0400 부터 0x7FFF 까지의 주소를 예약 해 뒀다고 한다.

WM_USER는 저 구역의 시작점을 나타내는 0x0400 이 메모리 번지를 가리키는 포인터 고.


그래서 

WM_USER + 100 이런식으로 사용이 가능하다.


3. WM_USER 의 전송은?


자신의 윈도우에서 처리할때는 

PostMessage(WM_USER);

SendMessage(WM_USER);


모든 윈도우로 전송할때는

::PostMessage(HWND, WM_USER, WPARAM, LPARAM);

::SendMessage(HWND, WM_USER, WPARAM, LPARAM);


을 이용하여 전송 해주면 된다.


4. WM_USER 의 수신 및 처리는?


메세지를 받아서 처리하고자 할때는 세가지 작업을 해 주어야 한다.


첫째는 MESSAGEMAP 에 추가를 해주는것.

BEGIN_~ 와 END_~ 사이에 ON_MESSAGE(WM_USER, OnFunction); 를 추가해준다


둘째는 헤더파일에 메세지 수신시 처리할 루틴을 선언 해준다

Afx_msg LRESULT OnFunction( WPARAM wParam, LPARAM lParam );


세번째로 선언된 처리 루틴의 내용을 작성 해준다.

LRESULT 클래스명::OnFunction( WPARAM wParam, LPARAM lParam )

{

처리할 내용 작성;

}


이렇게 세가지를 추가해주면 원하는 메세지를 받았을때 처리하고자 하는 대로 처리가 가능하다.


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

유효숫자 만큼 나타내기  (0) 2013.11.07
char* <--> CString 변환 함수  (0) 2013.11.07
Dialog based program 에서 Menu 만들기.  (0) 2013.08.06
Device Context ( DC )  (1) 2013.08.06
GetDlgItem() 함수를 이용하기  (0) 2013.07.03
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Dialog based program 에서 Menu 만들기.

Programming/C, C++, MFC 2013. 8. 6. 19:02






Dialog Based Program 에서는 기본적으로 메뉴가 없다..


음.. 없지 ㅋ 그래서 지금까진 필요한 기능들을 버튼에 다 넣곤 했는데


이게 메뉴가.. 만들어 붙이면 되는거더라고.. 그래 붙이면 되는데


왜 지금까지 그생각은 한번도 못한게지. ㅋ 


프로그래밍에는 영 소질이 없는것인가.. ㅠ 


여튼 뭐 중요한건 리소스에서 리소스 추가 - 메뉴 를 통해 메뉴를 생성하고




OnInitDialog() 여기에서 생성하던 멤버변수로 만들어두던 그건 알아서 하고


만들어둔 CMenu  를 통해 붙이면 된다.


CMenu menu;

menu.LoadMenuW(IDR_MENU1);

SetMenu(&menu);


이렇게 세줄만 추가해주면..



뙇! 메뉴가 생긴다.. 


사진에서 보이듯이 메뉴가 위에 붙으면서 그 메뉴 만큼 다른 요소들이 아래로 밀리니까 


그점은 미리 생각하고 옮겨주는 센스가 필요하겠다.


저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

char* <--> CString 변환 함수  (0) 2013.11.07
WM_USER 에 대하여.  (0) 2013.08.06
Device Context ( DC )  (1) 2013.08.06
GetDlgItem() 함수를 이용하기  (0) 2013.07.03
Memory Leaks 어디서 누수가 일어나는지 잡아보자..  (0) 2013.07.01
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Device Context ( DC )

Programming/C, C++, MFC 2013. 8. 6. 11:03





1. DC란 ?

DC 란 제목에서 보이듯이 Device Context의 약자이다.

출력을 위한 모든 데이터를 가지는 구조체.. 란다 얘가.


2. DC 의 필요성?

DC가 필요한 이유를 설명하자면 예를 들어 선을 그리는 경우 필요한 정보는 좌표만으로 그릴 수 있는게 아니다. 선의 굵기, 종류, 선의 색상 등 많은 정보가 필요하다. 이런 정보들을 한 곳에 모아 관리하는 것이 편리하고 효율적일 것이다. 그래서 DC에 모아 관리하는 것이며 그 다음으로는 좌표를 입력해 선을 긋는다고 했을때 그 좌표는 어디를 기준으로한 좌표일까? 바탕화면? 윈도우즈 프로그램은 혼자서 실행되지 않는다. 또한 화면을 독점적으로 사용하지 않는다. 그렇기 때문에 해당 프로그램의 윈도우를 기준으로 그려야하기 때문에 DC에는 기준에 대한 정보가 들어있다. 이에 추가로 원을 그린다고 가정했을 때 두개의 윈도우 창이 겹쳐져 있는경우 아래에 있는 창에 그렸다면 위에있는 윈도우창에 가려지는 부분은 그려지지 않아야할 것이다. 이런 복잡한 처리를 원 그리기 함수가 직접 한다는 것은 불가능하며 DC를 통해 이런 처리가 가능하다. DC는 현재 상황에서 어떤 영역이 출력 허가된 영역인가를 계산하여 허가된 영역에만 출력을 내보낸다.        -출처 : 윈도우즈 API 정복(한빛 미디어)


3. HDC? CDC?

우리가 사용하고자 하는 시스템 리소스(Bitmap, DC, .... 등등) 들은 외부에서 직접적으로 제어가 불가능 하다.

그렇기 HANDLE 이라는 개념을 사용한다. 이떄 DC 를  제어하는 핸들이 HDC 이다.


MFC 에서 출력과 관련된 다양한 정보를 제공해주는 디바이스 컨텍스트(DC)를 제공한다. DC는 응용 프로그램 화면에 출력하는 작업을 처리하기 위한 속성을 정의하고 있는 자료구조인데 MFC 에서는 DC를 관리하기 위한 클래스로 CDC를 제공한다. CDC는 텍스트를 출력하거나 그래픽 이미지를 출력하는 등에 관련된 다양한 멤버함수로 구현되어 있다. 


위 설명에서 볼수 있듯이 DC를 MFC 에서 사용하기 편리하도록 캡슐화 해서 만든 클래스가 CDC 이다. 


결론적으로 HDC 나 CDC 모두 DC를 제어하기 위한 껍데기 같은 역할이고 실질적인 내용물은 동일하다고 

생각되는데.. 맞는건가.. ㅋ 


4. CDC 의 파생 클래스

CClientDC
 
그래픽 관점에서 프로그램의 몸체를 구분해 보면 윈도우의 메뉴, 툴바, 상태창, 캡션바, 외각틀 등과 실제 프로그램의 출력부분으로 나눌 수 있다. 이렇게 실제 출력되는 부분을 화면 클라이언트 영역이라고 하는데 CClientDC는 이런 영역을 제어하는 클래스이다. 즉 CClientDC는 메뉴, 툴바 등을 제외한 View 부분을 제어할 수 있는 방법을 제공한다.

CPaintDC

 WM_PAINT 메시지가 발생되면 실행되는 OnPaint 메시지 함수에서 사용하는 DC이다. CPaintDC의 영역은 CClientDC와 같다. 단지 CPaintDC는 OnPaint 메시지 함수 내에서만 사용할 수 있다는 것이 다르다. 

CWindowDC
 
클라이언트영역과 함께 메뉴, 툴바, 상태창, 외각틀 등을 모두 포함한 영역을 윈도우 영역이라 말한다. Windows의 View 영역을 제어하기 위해서는 CClientDC를, 모든 영역을 제어하기 위해서는 CWindowDC를 사용한다.


5. DC 관련 사용가능한 함수들

BOOL TextOutW(int x, int y, const CString &str);                        // 지정된 위치에 텍스트 출력


int DrawText( CString &str, LPRECT lpRect, UINT nFormat);        // 지정된 사각형 안에 텍스트 출력


MoveTo( int x1, int y1 );    or MoveTo( CPoint point );                // 선을 그리는 함수

LineTo( int x2, int y2 );      or LineTo( CPoint point );


Rectangle( int x1, int y1, int x2, int y2 );

Rectangle( LPCRECT lpRect);                                                 // 사각형 (LPCRECT = CRect)


Ellipse( int x1, int y1, int x2, int y2);

Ellipse(LPCRECT lpRect);                                                        // 원


6. CDC -> HDC 변환


// CDC* pDC 일때

HDC* hDC;

hDC = pDC->m_hDC;

hDC = pDC->GetSafeHdc();


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


HDC hdc = :GetDC(hWnd);
CDC *pdc= CDC::FromHandle(hdc);

HDC hdc = ::GetDC(this->m_hWnd) ;


출처 : http://gandus.tistory.com/543

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





저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

WM_USER 에 대하여.  (0) 2013.08.06
Dialog based program 에서 Menu 만들기.  (0) 2013.08.06
GetDlgItem() 함수를 이용하기  (0) 2013.07.03
Memory Leaks 어디서 누수가 일어나는지 잡아보자..  (0) 2013.07.01
CFileDialog 다중파일 선택하기  (0) 2013.06.14
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

GetDlgItem() 함수를 이용하기

Programming/C, C++, MFC 2013. 7. 3. 09:41




GetDlgItem(ID) 


이함수의 반환형은 CWnd* 이다.


파라미터로 특정 아이템의 ID 를 입력해주면 그 아이템의 윈도우 포인터를 리턴해준다.


이 말은 기존에 아이템들에 다 변수를 부여해서 사용했던 나의 방식을 


변수 부여없이 바로 포인터를 가져와서 설정하는것으로 대체 가능하다는 뜻이지.. 


만약 EditBox 에 값을 변경할때 예전에는 변수설정하고 변수값 바꿔주고 이런식으로 했다면


GetDlgItem(EditBoxID)->SetWindowText(변경할 내용);


뭐 이런식으로 적용이 가능하다는 얘기다.


잘쓰면 유용한 기능이 될 것 같다.

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

Dialog based program 에서 Menu 만들기.  (0) 2013.08.06
Device Context ( DC )  (1) 2013.08.06
Memory Leaks 어디서 누수가 일어나는지 잡아보자..  (0) 2013.07.01
CFileDialog 다중파일 선택하기  (0) 2013.06.14
#define 에 관한 내용  (0) 2013.06.07
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Memory Leaks 어디서 누수가 일어나는지 잡아보자..

Programming/C, C++, MFC 2013. 7. 1. 10:01




메모리 누수 탐지 기능 사용

메모리 누수를 탐지하는 데 사용하는 기본 도구는 디버거와 CRT(C 런타임 라이브러리) 디버그 힙 함수입니다.

디버그 힙 함수를 사용하려면 다음 문이 프로그램에 포함되어 있어야 합니다.

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

CRT 함수가 제대로 작동하려면 #include 문이 여기에 표시된 순서를 따라야 합니다.

crtdbg.h를 포함하면 malloc 및 free 함수가 해당 디버그 버전인 _malloc_dbg 및 free에 매핑되어 메모리 할당 및 할당 해제를 추적할 수 있습니다. 이 매핑은 _DEBUG가 있는 디버그 빌드에서만 발생합니다. 릴리스 빌드에서는 일반적인 malloc 함수와 free 함수가 사용됩니다.

#define 문은 CRT 힙 함수의 기본 버전을 해당 디버그 버전에 매핑합니다. #define 문을 생략하면 메모리 누수 덤프가 덜 자세하게 표시됩니다.

이러한 문을 사용하여 디버그 힙 함수를 사용하도록 설정한 후에는 응용 프로그램 종료 지점 앞에_CrtDumpMemoryLeaks 호출을 추가하여 응용 프로그램이 종료될 때 메모리 누수 보고서를 표시할 수 있습니다.

_CrtDumpMemoryLeaks();

응용 프로그램의 종료 지점이 여러 개인 경우 각 종료 지점마다 _CrtDumpMemoryLeaks 호출을 수동으로 추가할 필요는 없습니다. 응용 프로그램의 시작 부분에 있는 _CrtSetDbgFlag 호출로 인해 각 종료 지점마다 _CrtDumpMemoryLeaks가 자동으로 호출되기 때문입니다. 다음과 같이 두 개의 비트 필드를 설정해야 합니다.

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

기본적으로 _CrtDumpMemoryLeaks는 출력 창의 디버그 창에 메모리 누수 보고서를 출력합니다._CrtSetReportMode를 사용하여 이 보고서를 다른 위치로 리디렉션할 수도 있습니다.

라이브러리를 사용할 경우에는 라이브러리에 의해 출력이 다른 위치로 다시 설정될 수도 있습니다. 이 경우 다음과 같이 출력 위치를 출력 창으로 다시 설정할 수 있습니다.

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
메모리 누수 보고서 해석

응용 프로그램에 _CRTDBG_MAP_ALLOC이 정의되지 않은 경우 _CrtDumpMemoryLeaks는 다음과 같은 메모리 누수 보고서를 표시합니다.

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

응용 프로그램에 _CRTDBG_MAP_ALLOC이 정의된 경우에는 메모리 누수 보고서가 다음과 같이 표시됩니다.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

두 번째 보고서에는 누수된 메모리가 처음 할당된 파일 이름 및 줄 번호가 표시된다는 차이점이 있습니다.

_CRTDBG_MAP_ALLOC의 정의 여부에 관계없이 메모리 누수 보고서에 항상 표시되는 정보는 다음과 같습니다.

  • 메모리 할당 번호(이 예제의 경우 18)

  • 블록 형식(이 예제의 경우 normal)

  • 16진수 메모리 위치(이 예제의 경우 0x00780E80)

  • 블록 크기(이 예제의 경우 64 bytes)

  • 블록 내 데이터의 처음 16바이트(16진수 형식)

메모리 누수 보고서에서는 메모리 블록을 표준 블록(normal block), 클라이언트 블록(client block) 또는 CRT 블록(CRT block)으로 식별합니다. 표준 블록은 프로그램이 할당한 보통 메모리입니다. 클라이언트 블록은 MFC 프로그램이 소멸자를 필요로 하는 개체에 대해 사용하는 특별한 메모리 블록 형식입니다.MFC new 연산자는 표준 블록 또는 클라이언트 블록 중 생성되는 개체에 적합한 블록을 만듭니다. CRT 블록은 CRT 라이브러리가 자체 용도에 맞게 할당한 메모리 블록입니다. 이러한 블록의 할당 해제는 CRT 라이브러리에서는 처리됩니다. 따라서 CRT 라이브러리 손상 같은 중대한 문제가 발생하지 않는 한 메모리 누수 보고서에 이 블록이 표시되는 경우는 거의 없습니다.

그 외에도 메모리 누수 보고서에 표시되지 않는 두 가지 메모리 블록 형식이 있습니다. 빈 블록은 해제된 메모리로, 정의에 따라 누수되지 않은 메모리를 나타냅니다. 무시 블록은 메모리 누수 보고서에서 제외하도록 사용자가 명시적으로 지정한 메모리입니다.

이러한 기술은 표준 CRT malloc 함수를 사용하여 할당된 메모리에 대해 작동합니다. 프로그램에서는 C++ new 연산자를 사용하여 메모리를 할당하지만, 메모리 누수 보고서에 파일 및 줄 번호를 표시하려면 new를 다시 정의해야 합니다. 이 작업에는 다음과 같은 코드 블록을 사용할 수 있습니다.

#ifdef _DEBUG
   #ifndef DBG_NEW
      #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
      #define new DBG_NEW
   #endif
#endif  // _DEBUG
메모리 할당 번호에 중단점 설정

메모리 할당 번호는 누수된 메모리 블록이 할당된 시기를 알려 줍니다. 예를 들어 메모리 할당 번호가 18인 블록은 응용 프로그램 실행 도중 18번째로 할당된 메모리 블록입니다. CRT 보고서에서는 실행 중의 모든 메모리 블록 할당 횟수를 계산합니다. 여기에는 CRT 라이브러리와 MFC 등의 다른 라이브러리에 의한 할당이 포함됩니다. 따라서 메모리 할당 번호가 18인 블록은 코드에서 18번째로 할당된 메모리 블록이 아닐 수도 있습니다. 대개는 이 경우에 해당됩니다.

할당 번호를 사용하여 메모리 할당에 중단점을 설정할 수 있습니다.

조사식 창을 사용하여 메모리 할당 중단점을 설정하려면

  1. 응용 프로그램의 시작 부분에 중단점을 설정하고 응용 프로그램을 시작합니다.

  2. 응용 프로그램이 중단점에서 중단되면 조사식 창을 실행합니다.

  3. 조사식 창에서 이름 열에 _crtBreakAlloc을 입력합니다.

    CRT 라이브러리의 다중 스레드 DLL 버전을 사용할 경우(/MD 옵션){,,msvcr100d.dll}_crtBreakAlloc과 같이 컨텍스트 연산자를 포함해야 합니다.

  4. RETURN 키를 누릅니다.

    디버거에서 호출이 실행되고 결과가 값 열에 표시됩니다. 메모리를 할당할 때 중단점을 설정하지 않은 경우에는 이 값이 –1입니다.

  5. 값 열에서 표시된 값을 중단할 메모리 할당의 할당 번호로 대체합니다.

메모리 할당 번호에 중단점을 설정한 후 디버깅을 계속할 수 있습니다. 이전과 같은 조건에서 프로그램을 실행하려면 메모리 할당 순서가 변경되지 않도록 주의하십시오. 지정된 메모리 할당에서 프로그램이 중단되면 호출 스택 창과 다른 디버거 정보를 사용하여 메모리가 할당된 조건을 확인할 수 있습니다. 그런 다음 실행을 계속하여 개체에 발생한 상황을 살펴보고 메모리가 올바르게 할당 해제되지 않은 원인을 확인할 수 있습니다.

개체에 데이터 중단점을 설정하는 것도 유용합니다. 자세한 내용은 방법: 데이터 중단점 설정(네이티브 전용)을 참조하십시오.

코드에서 메모리 할당 중단점을 설정할 수도 있습니다. 여기에는 두 가지 방법이 있습니다.

_crtBreakAlloc = 18;

또는


_CrtSetBreakAlloc(18);

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


정리 하자면 미리컴파일된 헤더 사용시에는 그곳에 아니면 인클루드 된 헤더에 

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

추가해주고 

new or malloc 을 사용하는 cpp 파일 상단에 

#if _DEBUG

#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)

#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)

#endif

추가..


그리고 프로그램 시작 부분에 

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


추가해주면 된다! 

저작자표시 비영리 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

Device Context ( DC )  (1) 2013.08.06
GetDlgItem() 함수를 이용하기  (0) 2013.07.03
CFileDialog 다중파일 선택하기  (0) 2013.06.14
#define 에 관한 내용  (0) 2013.06.07
MFC TabControl 사용법  (2) 2013.04.30
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

CFileDialog 다중파일 선택하기

Programming/C, C++, MFC 2013. 6. 14. 10:57








CFileDialog를 이용하여 다중 파일을 선택하는 방법..

다중파일 선택하는 방법만 많이 나와있지 여러개 선택할때 14개 이상 선택이 안되던 내 버그에 대한글을

찾는것은 쉽지 않았다.. 


결론은 메모리문제.. 메모리문제를 해결하기위한 코드를 추가한 방법이다.

선택된 파일을 리스트박스에 추가해준다.


-----------------------------------------------------------------------------------------------


CString str = _T("JPEG(*.jpg)|*.jpg|"); // 선택할 파일 종류

CString File;

CString strFileList; 


CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this);


const int c_cMaxFiles = 400 /*선택할 파일 숫자*/ ; // 메모리 부족현상으로 확장 안해주면 몇개 못씀

const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;

dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize);

dlg.GetOFN().nMaxFile = c_cbBuffSize;


if( dlg.DoModal() == IDOK)

{

for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)

{

// 전체삭제는 ResetContent

File = dlg.GetNextPathName(pos);

m_TrainingList.AddString(File);

}

}




저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

GetDlgItem() 함수를 이용하기  (0) 2013.07.03
Memory Leaks 어디서 누수가 일어나는지 잡아보자..  (0) 2013.07.01
#define 에 관한 내용  (0) 2013.06.07
MFC TabControl 사용법  (2) 2013.04.30
MFC Picture Control 에 BMP 파일 출력하기  (1) 2013.04.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

#define 에 관한 내용

Programming/C, C++, MFC 2013. 6. 7. 09:03




소스코드를 보다보면 

#ifndef XXX

#define XXX

~~~~~~~

#endif


이런 구문을 자주 봤는데 이게 어떤 의미인지 몰라 찾아봤다 


아래는 #define 전처리문에 관한 지식인에서 긁어온 내용이다. 정리가 잘 되어있는거 같다.


----------------------------------------------------------------------------------------


#define 이라는 구문은 컴파일러가 아닌 전처리기에 의해 처리되는 전처리기구문이라는 것을 아실 것입니다. (MS의 cl.exe 컴파일러는 전처리처리, 컴파일, 링킹 등을 모두 처리할 수 있기는 합니다만...)



기본적으로  define 구문의 기본 형태는 아래와 같습니다.
#define A B
'A를 B로 치환'하겠다는 의미라고 보시면 됩니다.

질문자는 B가 인자라고 생각하고 있는데, B는 인자가 아닙니다.
예를 들면,
#define max(a,b)            (((a) > (b)) ? (a) : (b))
와 같이 괄호가 나와야, a, b를 인자라고 볼 수 있는 것입니다.

#define 구문은 여러가지 기능이 있기 때문에 형태에 따라 다양하게 이용될 수 있습니다.
몇 가지 소개를 해드리는 선에서 마무리하겠습니다.

1. B 부분이 없다. (가드(guard)로 사용)
 - 질문자가 언급했던 sal.h를 열어보면 #define __ATTR_SAL 같은 구문이 있습니다.
 보통 #define TRUE 1 같은 구문과 달리 뭔가 대체하는 값이 없어보입니다.
이것은 전처리기에 정의(define)을 하되 특정한 값을 부여해주지 않은 형태라고 보시면 됩니다.

 - 활용예. 헤더파일 가드(여러 파일에서 include 되는 경우 중복 선언을 방지)를 위해 많이 사용됩니다.
 - 적용예. stdio.h를 열어보면 전체적으로 아래와 같은 구조로 되어 있을 것입니다.
#ifndef _INC_STDIO #define _INC_STDIO
... stdio.h의 내용
#endif  /* _INC_STDIO */
_INC_STDIO 라는 이름이 정의되어 있지 않으면 해당 블록(endif를 만날 때까지)의 내용을 유효하다고 보는 것이지요. 그런데 바로 아래 #define으로 해당 이름을 정의해서 한군데라도 먼저 포함하고 있으면 두번째는 include에서 무효화가 되는 것이지요.

A라는 헤더에서 stdio.h와 b.h를 포함하고 있다고 가정할 때, b.h 역시 stdio.h를 포함하고 있다고 하면 결국 A관점에서는 stdio.h가 두 번 하나의 헤더에 포함이 되게 되겠죠. 이런 경우가 흔히 발생되기 때문에 가드가 필요한 것입니다. 구글 역시 #define 가드를 스타일 가이드(클릭)에 포함하고 있습니다.

2. B부분이 하나(기본형태)
 - 위에서 설명한 형태라 넘어갑니다.

3. B부분이 여러개
 - 하나이나 여러개이나 별 차이는 없습니다.

#define A B
A를 B로 치환하겠다는 의미라고 보시면 됩니다.
질문자는 B가 인자라고 생각하고 있는데 보통 B를 인자라고 이야기하지 않습니다.

예를 들면,
소스코드 원문보기
  1. #define THAT +2 
  2. #define AND     +3 
  3. #define ETC     +5 
  4. #define THIS_IS   THAT AND ETC 
  5. int main() 
  6. { 
  7.    int i = THIS_IS; 
  8.    return 0; 
  9. } 

#define THIS_IS   THAT AND ETC 와 같은 부분이 있습니다만 결국은,,
전처리기에 의해 

소스코드 원문보기
  1. int main() 
  2. { 
  3.    int i = THAT AND ETC; 
  4.    return 0; 
  5. } 
로 바뀌고 다시,
소스코드 원문보기
  1. int main() 
  2. { 
  3.    int i = +2 +3 +5; 
  4.    return 0; 
  5. } 
의 형태가 되어버립니다. (최적화하는 컴파일러는 int i = 10; 이라는 상수로 만들 수 있습니다.)

Visual Studio의 경우 printf 함수의 선언 역시 SAL로 어노테이션되어 있습니다.
소스코드 원문보기
  1. _Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...); 

[crtdefs.h]
#define _Check_return_opt_
#define _CRTIMP __declspec(dllimport)

[sal.h]
#define _In_z_                         _Pre_z_      _Deref_pre_readonly_
#define _Printf_format_string_ _Printf_format_string_impl_
#define _Pre_z_                          _Pre2_impl_(_$notnull,  _$zterm) _Deref_pre1_impl_(_$valid)
#define _Deref_pre_readonly_                   _Deref_pre1_impl_(_$readaccess)
#define _Printf_format_string_impl_   [SA_FormatString(Style="printf")]
#define _Pre2_impl_(p1,p2)                 [SA_Pre(p1,p2)]
#define _Deref_pre1_impl_(p1)              [SA_Pre(Deref=1,p1)]

결국 stdio.h에 선언된 최초 문장은 아래와 같이 바뀌고,,,
(_Check_return_opt_는 없어집니다)
소스코드 원문보기
  1. __declspec(dllimport) int __cdecl printf(_Pre_z_      _Deref_pre_readonly_ _Printf_format_string_impl_ const char * _Format, ...); 
위의 문장은 아래와 동일합니다.
소스코드 원문보기
  1. __declspec(dllimport) int __cdecl printf(_Pre2_impl_(_$notnull,  _$zterm) _Deref_pre1_impl_(_$valid)      _Deref_pre1_impl_(_$readaccess) [SA_FormatString(Style="printf")] const char * _Format, ...); 
소스코드 원문보기
  1. __declspec(dllimport) int __cdecl printf([SA_Pre(_$notnull,  _$zterm)] [SA_Pre(Deref=1,_$valid)]      [SA_Pre(Deref=1,_$readaccess)] [SA_FormatString(Style="printf")] const char * _Format, ...); 

이런 어노테이션(annotation) 문장들은 코드 분석 도구(code analysis tool)에 의해 읽혀져 컴파일시에 미리 유용하게 사용자에게 경고나 에러를 돌려줄 수 있게 해줍니다.

저작자표시 (새창열림)

'Programming > C, C++, MFC' 카테고리의 다른 글

Memory Leaks 어디서 누수가 일어나는지 잡아보자..  (0) 2013.07.01
CFileDialog 다중파일 선택하기  (0) 2013.06.14
MFC TabControl 사용법  (2) 2013.04.30
MFC Picture Control 에 BMP 파일 출력하기  (1) 2013.04.02
MFC 에서 wav 파일 재생하기  (1) 2013.04.02
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

cv::Mat Class 사용법

Programming/OpenCV 2013. 5. 6. 13:44




아래 내용은 다크pgmr ( http://darkpgmr.tistory.com/46 ) 님의 블로그에서 복사한 내용입니다.


내용에 내가 필요료 하는 것들 추가로 기록할 예정입니다.


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


using namespace cv;


1. 이미지 읽기 & 저장

Mat img_color = imread("sample.jpg"); // color load

Mat img_gray = imread("sample.jpg", 0);// gray load

imwrite("fname.jpg", img);


2. 이미지 생성, 복사, 형변환, 색상변환, roi 설정

int w = 320;// width

int h = 240;// height


// 생성

Mat img(h,w,CV_8UC1);                    //1채널 unsigned char

Mat img(h,w,CV_8UC3);                    //3채널 unsigned char

Mat img = Mat::zeros(h,w,CV_32FC1);//1채널 float

Mat img = Mat::ones(h,w,CV_64FC3);//3채널 double


unsigned char * img_buffer;            // 이미지버퍼 포인터

Mat img(h, w, CV_8UC3, img_buffer);//메모리 공유


// 원소 초기화

Mat img(h,w,CV_8UC1);

img = Scalar(3);                 // img 모든 원소값 3으로 초기화


// 참조, 복사

Mat img2 = img;                 // 메모리 공유

Mat img2 = img.clone(); // 별도 메모리

Mat img2; img.copyTo(img2);//별도 메모리


// 형변환 복사

Mat img1(h,w,CV_32FC1);

Mat img2;

img1.convertTo(img2, CV_8U);


// gray-color 변환

cvtColor(color, gray, CV_BGR2GRAY);

cvtColor(gray, color, CV_GRAY2BGR);


// roi 설정

Rect roi;

Mat sub_img = img(roi);                //메모리공유

Mat sub_img = img(roi).clone();    //별도메모리


3. 영상 크기변경 및 상하좌우 반전

// 크기 변경

Mat dst;

resize(img, dst, Size(new_w,new_h));

resize(img, dst, Size(), 0.5, 0.5);    //scalex, scaley


// 영상 반전(flip)

flip(img, dst, 0);        // vertical flip

flip(img, dst, 1);        // horizontal flip

flip(img, dst, -1);       // vertial & horizontal flip


4. 이미지에 그리기 (drawing)

Rect rc(x,y,w,h);

Scalar color(B,G,R);

int thickness=1;         // line thickness


line(img, Point(x1,y1), Point(x2,y2), color, thickness);


rectangle(img, rc, color, thickness);

rectangle(img, rc.tl(), rc.br(), color, thickness);

rectangle(img, rc, color, CV_FILLED); // filled rectangle


Point center(rc.x+rc.width/2, rc.y+rc.height/2);

Size radius(rc.width/2, rc.height/2);

double rot_deg = 0;     // rotation of ellipse

double s_deg = 0;     // start angle of arc

double e_deg = 360;     // end angle of arc

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,thickness);

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,CV_FILLED);


int circle_radius = 10;

circle(img, center, circle_radius, color, thickness);

circle(img, center, circle_radius, color, CV_FILLED);


putText(img, "text", Point(x,y), FONT_HERSHEY_SIMPLEX, 1., color, thickness);

putText(img, "text", Point(x,y), FONT_HERSHEY_DUPLEX, 1., color, thickness);


5. 이미지 디스플레이하기 (display)

namedWindow("name");                                 // auto resized

namedWindow("name",CV_WINDOW_NORMAL); // manual resize


imshow("name", img);

char ch = waitKey();     // 무한 대기

char ch = waitKey(10);    // 10 msec 대기

if(ch == 27) ...             // ESC key

if(ch == 32) ...             // SPACE key


destroyWindow("name");

destroyAllWindows();


6. 웹캠 연결하기

VideoCapture vc(0);

if (!vc.isOpened()) return; // 연결실패

vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);

vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);


Mat img;

while(1){

vc >> img;

if(img.empty()) break;

imshow("cam",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();


7. avi 비디오 파일 읽어오기

VideoCapture vc("sample.avi");

if (!vc.isOpened()) return; // 불러오기 실패


Mat img;

while(1){

vc >> img;

if(img.emplty()) break;

imshow("video",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();


8. avi 비디오 녹화하기

double fps = 15;

int fourcc = CV_FOURCC('X','V','I','D'); // codec

bool isColor = true;


VideoWriter *video = new VideoWriter;

if(!video->open("result.avi", fourcc, fps, Size(img_w, img_h), isColor)){

delete video;

return;

}


Mat img;

while(1){

// ...

*video << img;

// ...

}

delete video;


9. Mat <--> IplImage

Mat --> IplImage

Mat matimg;

IplImage* iplimh;

iplimg = &IplImage(matimg);


IplImage --> Mat


IplImage* iplimg;

Mat matimg;

matimg(iplimg);

  
10. 픽셀 접근법
  Mat image;
  
  // 3 channel Image

  1. for(int j=0; j < image.rows; j++)
  2. {
  3.         for(int i=0; i < image.cols; i++)
  4.         {
  5.                  image.at<Vec3b> (j,i)[0] += 30;
  6.                  image.at<Vec3b> (j,i)[1] += 20;
  7.                  image.at<Vec3b> (j,i)[2] += 20;
  8.  
  9.         }
  10. }

이때 Vec3b 는 unsigned char 형이다 
b(unsigned char) 외에도 s(short), i(int), f(float), d(double) 형의 벡터가 존재한다.

* 추가사항 *

cv::Mat클래스의 at메소드를 사용한다면 가끔은 성가실 수 있다. 행렬 타입을 알고 있다면 cv::Mat의 템플릿 하위 클래스인 cv::Mat_ 클래스를 사용할 수 있다.

 

cv::Mat_<uchar> im2 = image;  //im2는 image를 참조

im2(50,100) = 0; // 50행 100열 화소에 접근

[출처] 화소값 접근|작성자 signushyoga



    저작자표시 (새창열림)

    'Programming > OpenCV' 카테고리의 다른 글

    [Function] IplImage 에 한글text 삽입하기  (1) 2013.11.07
    DC -> IplImage로 전환  (0) 2013.08.08
    OpenCV 주요함수  (0) 2013.04.29
    cvHoughLines2 함수를 이용한 직선 검출  (0) 2013.04.29
    OpenCV 를 이용하여 동영상 재생하기.  (0) 2013.04.26
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    MFC TabControl 사용법

    Programming/C, C++, MFC 2013. 4. 30. 16:18




    오늘 공부한 내용은 MFC 에서 Tab Control을 이용한 Dialog 만들기!


    네이버 블로그에 정리 잘 해 두신 분이 있어서 그분 블로그 보고 구현 해 보았다.


    먼저 다이얼로그 베이스 프로젝트에서 다이얼로그에 tabControl 을 하나 만들어 준다.




    그후에 TabControl에 변수를 추가해 준다.



    변수이름은 임의로 설정하고 그 외의 설정 사항은 기본 사항을 이용한다.

    변수형식 - CTabCtrl

    컨트롤 변수 사용



    변수를 생성 하였으면 

    프로젝트명Dlg.cpp 파일에서 OnInitDialog 함수에서 탭 추가를 해줘야 한다.

    CString 을이용해 탭 이름을 만들고 InsertItem 함수를 이용해서 탭에 추가해준다.



    이제 탭은 추가가 되었으나 그 탭들은 모두 비어 있는 상태이다.

    빈 탭에 넣어줄 서브다이얼로그를 생성해준다.


    위에서 3개의 탭을 생성했으니 subDialog 도 3개 생성을 해준다

    이때 중요한 점은 ID를 기억해 둬야 한다는 점과 

    Border - None

    Style - Child

    이 두가지 설정을 해줘야 한다. 

    이 설정이 없을경우 탭 안에서 제목표시줄이 생기고 심지어 이동까지 가능해 지므로 설정 해주기를 권장.




    3개의 subDialog를 생성했으면 아래와 같이 각각 Dialog에 클래스추가를 해준다.





    클래스를 모두 생성했으면 

    프로젝트명Dlg.h 파일에서 클래스 해더파일을 모두 include 해주고 

    해당클래스변수를 하나씩 생성 해 준다.

    여기에 윈도우 포인터변수도 하나 추가를 해 줘야한다고한다..

    (아직 자세히 모르니 일단.. 추가하자..)




    새로 추가한 윈도우 변수는 cpp파일에서 초기값 NULL을 설정해주자.




    이어서 cpp파일의 OnInitDialog 함수에 이어서 아래와 같은 내용을 추가해준다.



    이때 Rect 는 탭의 크기를 받아오기때문에 탭 내부에 서브탭을 넣기 위해서는 적절하게 크기 조절을 해준다.

    (여기서는 10과 30의 값을 이용.)

    나머지 파라미터는 .. 음.. 안찾아봤다.. 

    그리고 주의해야할 점이 SWP_SHOWWINDOW 옵션은 첫번째 항에만 추가를 해줘야 한다는데..

    이것도... 테스트도... 검색도 안해봤다... 일단 그렇단다.. 


    여기까지 왔으면 탭이 나오고 그 탭안에 서브탭이 보일것이다..

    But 그러나... 탭이 바뀌어도 서브탭은 변하지 않고..


    이문제를 해결하기위해 다이얼로그 tabcontrol을 클릭하고 

    컨트롤 이벤트(번개모양) 창에서 

    TCN_SELCHANGE 항목을 누르고 처리 함수를 추가 해준다.

    프로퍼티 창의 너비를 좁게 해놓을 경우 SELCHANGE 와 SELCHANGEING 은 앞에는 똑같이 보이므로

    햇갈리지 않도록 주의한다.. 

    잘못만들면 반응이 한탬포씩 늦어지더라..


    여튼 아래와 같이 이벤트 처리 함수를 만들어 주고..



    이벤트 처리 함수 내부에 아래와 같은 코드를 추가 해 준다.

    이 코드를 추가해 주면 탭간 이동시에 서브탭도 같이 변하는 것을 알 수 있다.



    이상 탭컨트롤 생성 실습 끝..


    이건 내가 나중에 다시보려고 기록 해 둔것이니 

    보다 자세한 설명을 보고싶다면.. 내가 참고한 아래 블로그에서 다시 보기..


    http://blog.naver.com/sangyun9844?Redirect=Log&logNo=30093087459



    저작자표시 (새창열림)

    'Programming > C, C++, MFC' 카테고리의 다른 글

    CFileDialog 다중파일 선택하기  (0) 2013.06.14
    #define 에 관한 내용  (0) 2013.06.07
    MFC Picture Control 에 BMP 파일 출력하기  (1) 2013.04.02
    MFC 에서 wav 파일 재생하기  (1) 2013.04.02
    [Function] dialog 에 FPS 표시하기  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    OpenCV 주요함수

    Programming/OpenCV 2013. 4. 29. 15:27




    OpenCV에서 주로 사용하는 함수들


    자주 쓰는 함수가 잘 정리되어있는것 같아서 

    나중에 필요할때 찾아보려 저장.



    영상입출력
    cvLoadImage영상 읽기IplImage* cvLoadImage( const char* filename, int iscolor = 1);
    * isColor 값 종류
    #define CV_LOAD_IMAGE_COLOR           1
    #define CV_LOAD_IMAGE_GRAYSCALE     0
    #define CV_LOAD_IMAGE_UNCHANGED  -1
    cvShowImage영상 보기void cvShowImage( const char* name,
                                const CvArr* image );
    cvSaveImage영상 저장int cvSaveImage( const char* filename,
                            const CvArr* image );
    창 제어
    cvNamedWindow창 생성int cvNamedWindow( const char* name,
                                   int flags );
    cvMoveWindow창 이동void cvMoveWindow( const char* name,
                                   int x, 
                                   int y );
    cvDestroyWindow창 파괴void cvDestroyWindow( const char* name );
    cvDestroyAllWindows모든 창 파괴void cvDestroyAllWindows();
    cvResizeWindow창 크기 조절void cvResizeWindow( const char* name,
                                    int width,
                                    int height );
    영상 조작
    cvCreateImage영상 데이터 할당IplImage* cvCreateImage( CvSize size,
                                         int depth,
                                         int channels );
    cvReleaseImage할당한 영상 데이터를 해제
    구조체를 삭제하고 메모리 반환
    void cvReleaseImage( IplImage** image);
    cvCloneImage영상 데이터 복제IplImage* cvCloneImage( const IplImage* image );
    cvThreshold영상의 이진화 수행하는 함수void cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type);
    매트릭스
    cvCreateMat매트릭스 구조체를 만들어주는 함수CvMat* cvCreateMat(int rows, int cols, int type);
    cvSetZero매트릭스 모든 항을 0으로 만듬void cvSetZero(CvArr* arr);
    cvmSet매트릭스 항에 값을 쉽게 넣을 수 있음CV_INLINE void cvmSet(CvMat* mat, int row, int col, double value);
    cvmGet매트릭스 항의 값을 쉽게 얻을 수 있음CV_INLINE void cvmGet(CvMat* mat, int row, int col);
    카메라 처리 관련
    cvCreateCameraCapture
    = cvCaptureFromCAM
    CvCapture 구조체 생성하고 그 포인터 반환, 카메라와 구조체 연결 역할CvCapture* cvCreateCameraCapture(int index);
    cvGrabFrame카메라에서 입력된 영상 한 프레임 잡음int cvGrabFrame(CvCapture* capture);
    cvRetrieveFrame잡은 프레임에서 이미지 얻어냄IplImage* cvRetrieveFrame(CvCapture* capture);
    cvQueryFrame카메라에서 한 프레임 잡아와서 이미지 구조체에 넘어줌IplImage* cvQueryFrame(CvCapture* capture);
    cvReleaseCaptureCvCapture 구조체의 메모리 반환void cvReleaseCapture(CvCapture** capture);
    cvCreateVideoWriter비디오출력기 생성해주는 함수CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color CV_DEFAULT(1));
    cvWriteFrame비디오 출력기에 이미지 넘겨줌int cvWriteFrame(CvVideoWriter* writer, const IplImage* image);
    cvReleaseVideoWriter비디오 출력기 메모리 반환void cvReleaseVideoWriter(CvVideoWriter** writer);
    그 외
    cvWaitKey키 입력 받을 수 있도록 대기시간 가짐int cvWaitKey(int delay CV_DEFAULT(0));
    cvSplit영상의 채널을 각각의 싱글 채널 이미지 구조체에 자동적으로 분리 void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3);
    cvGetReal2D지정한 좌표의 픽셀값 리턴double cvGetReal2D(const CvArr* arr, int idx0, int idx1);
    cvSetReal2D이미지 데이터의 어떤 좌표에 값을 넣어줌double cvSetReal2D(const CvArr* arr, int idx0, int idx1);

    [출처] OpenCV 주요함수|작성자 윈섬

    저작자표시 (새창열림)

    'Programming > OpenCV' 카테고리의 다른 글

    DC -> IplImage로 전환  (0) 2013.08.08
    cv::Mat Class 사용법  (0) 2013.05.06
    cvHoughLines2 함수를 이용한 직선 검출  (0) 2013.04.29
    OpenCV 를 이용하여 동영상 재생하기.  (0) 2013.04.26
    Haar Face Detection  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    cvHoughLines2 함수를 이용한 직선 검출

    Programming/OpenCV 2013. 4. 29. 15:02






      IplImage* cam_image =  캠에서 입력받은 영상이나 뭐든 여튼 이미지

      IplImage* output = cvCreateImage(cvGetSize(cam_image), 8, 1);     //edge출력을위한 1채널 영상

    IplImage* gray = cvCreateImage(cvGetSize(cam_image), 8, 1);         //edge검출을위한 1채널 영상

            IplImage* color_output = cvCreateImage(cvGetSize(cam_image), 8, 3); //hough 출력을위한 3채널 영상


    CvMemStorage* storage = cvCreateMemStorage(0);

    CvSeq* lines = 0;


    cvCvtColor(cam_image, gray,CV_RGB2GRAY);

    cvCanny(gray, output, 50,200, 3);

    cvCvtColor(output, color_output, CV_GRAY2RGB);


    //CV_HOUGH_PROBABILISTIC MODE

    lines = cvHoughLines2(output, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 30, 3);


    for(int i=0; i<lines->total; i++)

    {

    CvPoint* line = (CvPoint*)cvGetSeqElem(lines, i);

    cvLine(color_output, line[0], line[1], CV_RGB(255, 0, 0), 2, 8);

    }


    cvNamedWindow("Hough");

    cvShowImage("Hough", color_output);


    cvReleaseImage(&output);

    cvReleaseImage(&gray);

    cvReleaseImage(&color_output);


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

    cvHoughLines2 함수 파라미터에 대한 설명이다

    Parameters:
    • image – 8-bit, single-channel binary source image. The image may be modified by the function.
    • lines – Output vector of lines. Each line is represented by a two-element vector (\rho, \theta) . \rho is the distance from the coordinate origin (0,0) (top-left corner of the image). \theta is the line rotation angle in radians ( 0 \sim \textrm{vertical line}, \pi/2 \sim \textrm{horizontal line} ).
    • rho – Distance resolution of the accumulator in pixels.
    • theta – Angle resolution of the accumulator in radians.
    • threshold – Accumulator threshold parameter. Only those lines are returned that get enough votes ( >\texttt{threshold} ).
    • srn – For the multi-scale Hough transform, it is a divisor for the distance resolution rho . The coarse accumulator distance resolution is rho and the accurate accumulator resolution is rho/srn . If both srn=0 and stn=0 , the classical Hough transform is used. Otherwise, both these parameters should be positive.
    • stn – For the multi-scale Hough transform, it is a divisor for the distance resolution theta.
    • method –

      One of the following Hough transform variants:

      • CV_HOUGH_STANDARD classical or standard Hough transform. Every line is represented by two floating-point numbers (\rho, \theta) , where \rho is a distance between (0,0) point and the line, and \theta is the angle between x-axis and the normal to the line. Thus, the matrix must be (the created sequence will be) of CV_32FC2 type
      • CV_HOUGH_PROBABILISTIC probabilistic Hough transform (more efficient in case if the picture contains a few long linear segments). It returns line segments rather than the whole line. Each segment is represented by starting and ending points, and the matrix must be (the created sequence will be) of the CV_32SC4 type.
      • CV_HOUGH_MULTI_SCALE multi-scale variant of the classical Hough transform. The lines are encoded the same way as CV_HOUGH_STANDARD.
    • param1 –

      First method-dependent parameter:

      • For the classical Hough transform, it is not used (0).
      • For the probabilistic Hough transform, it is the minimum line length.
      • For the multi-scale Hough transform, it is srn.
    • param2 –

      Second method-dependent parameter:

      • For the classical Hough transform, it is not used (0).
      • For the probabilistic Hough transform, it is the maximum gap between line segments lying on the same line to treat them as a single line segment (that is, to join them).
      • For the multi-scale Hough transform, it is stn.



    저작자표시 (새창열림)

    'Programming > OpenCV' 카테고리의 다른 글

    cv::Mat Class 사용법  (0) 2013.05.06
    OpenCV 주요함수  (0) 2013.04.29
    OpenCV 를 이용하여 동영상 재생하기.  (0) 2013.04.26
    Haar Face Detection  (0) 2013.04.02
    [Function] FindContour 덩어리 찾기  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    OpenCV 를 이용하여 동영상 재생하기.

    Programming/OpenCV 2013. 4. 26. 17:32




    cvNamedWindow("test");

    CvCapture* capture = cvCreateFileCapture("test.avi");

    IplImage* frame;

    char c;


    while(1)

    {

    cvGrabFrame(capture);

    frame = cvRetrieveFrame(capture);


    if(!frame) break;


    cvShowImage("test", frame);


    c = cvWaitKey(33);

    if( c == 27) break;

    }


    cvReleaseCapture(&capture);

    cvDestroyAllWindows();



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


    가장 기본적인 동영상 재생 함수.


    추가적으로 영상의 전체 프레임 수를 얻고싶으면 


    int TotalFrame= (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);


    위 함수를 이용하여 구할 수 있다. 



    저작자표시 (새창열림)

    'Programming > OpenCV' 카테고리의 다른 글

    OpenCV 주요함수  (0) 2013.04.29
    cvHoughLines2 함수를 이용한 직선 검출  (0) 2013.04.29
    Haar Face Detection  (0) 2013.04.02
    [Function] FindContour 덩어리 찾기  (0) 2013.04.02
    Duglas Puecker 외곽선 근사화  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    MFC Picture Control 에 BMP 파일 출력하기

    Programming/C, C++, MFC 2013. 4. 2. 19:34




    매번 리소스 등록은 해줘야하는건가..

    리소스 등록 . 참 귀찮더라..

     

    BMP 리소스등록


    Picture Control TYPE Bitmap 으로 변경 ( default == frame )

    CStatic* PictureControl 이름 = (CStatic*)GetDlgItem(PictureControl ID);
    CBitmap image;
    image.LoadBitmap(리소스등록된 BMP ID);
    PictureControl 이름->SetBitmap(image);

    저작자표시 (새창열림)

    'Programming > C, C++, MFC' 카테고리의 다른 글

    #define 에 관한 내용  (0) 2013.06.07
    MFC TabControl 사용법  (2) 2013.04.30
    MFC 에서 wav 파일 재생하기  (1) 2013.04.02
    [Function] dialog 에 FPS 표시하기  (0) 2013.04.02
    Debug 용 Console 창 생성하기  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,

    MFC 에서 wav 파일 재생하기

    Programming/C, C++, MFC 2013. 4. 2. 19:33




    wav파일 재생할때에는 동시에 두가지 파일을 재생할수 없다

    배경음악을 깔아두고 거기에 효과음을 넣고 싶었는데

    아래의 방법을 이용해서는 불가능 하단다..

     

     

    헤더에 우선 선언
    #pragma comment(lib, "winmm")
    #include <mmsystem.h>
     
    다음 플레이 할 경로를 구해온뒤
    CString szSoundPath = _T("./bgm.wav");
    PlaySound(szSoundPath, AfxGetInstanceHandle(),  SND_ASYNC | SND_LOOP); // 무한
    PlaySound(szSoundPath, AfxGetInstanceHandle(),  SND_ASYNC); // 1회 재생
    PlaySound(NULL, AfxGetInstanceHandle(),  NULL); // 정지

    저작자표시 (새창열림)

    'Programming > C, C++, MFC' 카테고리의 다른 글

    #define 에 관한 내용  (0) 2013.06.07
    MFC TabControl 사용법  (2) 2013.04.30
    MFC Picture Control 에 BMP 파일 출력하기  (1) 2013.04.02
    [Function] dialog 에 FPS 표시하기  (0) 2013.04.02
    Debug 용 Console 창 생성하기  (0) 2013.04.02
    블로그 이미지

    매직블럭

    작은 지식들 그리고 기억 한조각

    ,
    • «
    • 1
    • ···
    • 4
    • 5
    • 6
    • 7
    • 8
    • »

    카테고리

    • 살다보니.. (449)
      • 주절거림 (3)
      • 취미생활 (36)
        • 지식과 지혜 (3)
        • 풍경이 되어 (4)
        • Memories (17)
        • 엥겔지수를 높여라 (2)
      • mathematics (6)
        • Matrix Computation (2)
        • RandomProcesses (3)
      • English.. (8)
      • Programming (147)
        • C, C++, MFC (51)
        • C# (1)
        • OpenCV (17)
        • Python (58)
        • Git, Docker (3)
        • Matlab (4)
        • Windows (3)
        • Kinect V2 (2)
        • 기타 etc. (8)
      • 전공관련 (80)
        • Algorithm (6)
        • Deep Learning (54)
        • 실습 프로그램 (4)
        • 주워들은 용어정리 (8)
        • 기타 etc. (8)
      • Computer (118)
        • Utility (21)
        • Windows (31)
        • Mac (4)
        • Ubuntu, Linux (58)
        • NAS (2)
        • Embedded, Mobile (2)
      • IT, Device (41)
        • 제품 사용기, 개봉기 (14)
        • 스마트 체험단 신청 (27)
      • Wish List (3)
      • TISTORY TIP (5)
      • 미분류. 수정중 (1)

    태그목록

    • 스마트체험단
    • 매트랩
    • SVM
    • Convolutional Neural Networks
    • review
    • 매트랩 함수
    • DeepLearning
    • matlab function
    • 크롬
    • 일본
    • 에누리닷컴
    • DSLR
    • portugal
    • 칼로리 대폭발
    • matlab
    • LIBSVM
    • CStdioFile
    • 큐슈
    • utility
    • random variable
    • Computer Tip
    • 포르투갈
    • function
    • 후쿠오카
    • 갤럭시노트3
    • ReadString
    • Deep Learning
    • ColorMeRad
    • 딥러닝
    • 오봉자싸롱

    달력

    «   2025/08   »
    일 월 화 수 목 금 토
    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
    08-26 00:08

    LATEST FROM OUR BLOG

    RSS 구독하기

    BLOG VISITORS

    • Total :
    • Today :
    • Yesterday :

    Copyright © 2015 Socialdev. All Rights Reserved.

    티스토리툴바