On-line FlyCapture SDK Help
 
 
 
 
HOME > °í°´Áö¿ø >Tutorial
 
Á¦ 3 È­
¿¬¼Ó ±×·¦ Çϱâ
  • ¿¹Á¦ÄÚµå ´Ù¿î·Îµå
  • Step 2¿¡¼­´Â ¾Æ·¡¿Í °°ÀÌ Å©°Ô ´Ù¼¸°¡Áö ´Ü°è·Î À̹ÌÁö¸¦ ȹµæ ÇÏ´Â Äڵ带 ¾Ë¾Æ º¸¾Ò½À´Ï´Ù.

    "ÃʱâÈ­" -> "Ä«¸Þ¶ó ½ÃÀÛ" -> "¿µ»ó ȹµæ" -> "Ä«¸Þ¶ó Á¤Áö" -> "ÇØÁ¦"

    "ÃʱâÈ­"´Â Ä«¸Þ¶ó ¿µ»ó ȹµæÀ» À§ÇØ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´ç, ¾î¶² Ä«¸Þ¶ó¸¦ »ç¿ëÇÒ °ÍÀÎÁö µîÀÇ ±âº»ÀûÀÎ ¼³Á¤À» ÇÕ´Ï´Ù. °ü·ÃµÈ ÇÔ¼ö·Î´Â flycaptureCreateContext ¿Í flycaptureInitialize/flycaptureInitializePlus ¶ó´Â ÇÔ¼ö°¡ ÀÖ½À´Ï´Ù.(flycaptureInitializePlus ´Â Ä«¸Þ¶ó°¡ ¿µ»ó ȹµæ ÇÁ·Î¼¼½º¸¦ ÁøÇàÇÒ¶§ »ç¿ëµÉ ¹öÆÛ¸¦ Á÷Á¢ ¼³Á¤ ÇÒ ¼ö ÀÖ½À´Ï´Ù.)
    "Ä«¸Þ¶ó ½ÃÀÛ" ´Ü°è´Â Ä«¸Þ¶ó¿¡¼­ ¿µ»ó ȹµæÇÏ´Â ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÏ´Â ´Ü°èÀÔ´Ï´Ù. flycaptureStart °¡ ÀÌ¿¡ ´ëÇÑ ÇÔ¼ö À̱¸¿ä. ¿µ»ó ȹµæ ÇÁ·Î¼¼½º°¡ ½ÃÀ۵Ǹé Ä«¸Þ¶ó¿¡¼­ ȹµæÇÑ À̹ÌÁö µ¥ÀÌÅÍ´Â ÃÔ¿µµÇ´Â ´ë·Î PCÀÇ À̹ÌÁö¹öÆÛ¿¡ ¿Å°Ü Áý´Ï´Ù. ¿µ»ó ȹµæ ÇÁ·Î¼¼½º°¡ ÁøÇàÁßÀÏ ¶§ "¿µ»ó ȹµæ" ÇÔ¼ö¸¦ ¼öÇàÇϸé À̹ÌÁö ¹öÆÛÁß¿¡ ÇÑÀåÀÇ À̹ÌÁö¸¦ ȹµæ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
    "Ä«¸Þ¶ó Á¤Áö" ´Ü°è(flycaptureStop)´Â Ä«¸Þ¶ó ¿µ»ó ȹµæ ÇÁ·Î¼¼½º¸¦ ÁßÁöÇϰí, "ÇØÁ¦"´Ü°è(flycaptureDestroyContext)´Â "ÃʱâÈ­"¿¡¼­ ¼öÇàÇß´ø°Í¿¡ ´ëÇÑ ÇØÁ¦¸¦ ÇÕ´Ï´Ù.

    Step 2ÀÇ ¿¹Á¦¿¡¼­´Â ´Ü ÇÑÀåÀÇ À̹ÌÁö ¹Û¿¡ ȹµæ ÇÒ ¼ö ¾ø´Â ÄÚµå ¿´½À´Ï´Ù. Step 3¿¡¼­´Â ¿µ»ó ȹµæ ÇÔ¼ö¸¦ ¿¬¼ÓÀ¸·Î ¼öÇàÇÏ¿© µ¿¿µ»ó°ú °°ÀÌ ¿¬¼ÓµÈ À̹ÌÁö¸¦ ȹµæÇÏ¿© displayÇÏ´Â Äڵ忡 ´ëÇØ »ìÆì º¸°Ú½À´Ï´Ù.

     

     

    0.

    Dialog ±â¹Ý ÇÁ·ÎÁ§Æ®¸¦ »ý¼º

    1.

    Çì´õ ÆÄÀÏ include
    ´ÙÀ̾ó·Î±× Ŭ·¡½ºÀÇ cpp ÆÄÀÏ »ó´Ü¿¡ FlyCapture SDK¸¦ »ç¿ëÇϱâ À§ÇÑ Çì´õ ÆÄÀÏÀ» include ÇÕ´Ï´Ù.

    // FlyCapThrDlg.cpp : ±¸Çö ÆÄÀÏ
    //

    #include "stdafx.h"
    #include "flycapture_test.h"
    #include "flycapture_testDlg.h"

    #include "pgrflycapture.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    2. ¹öư »ý¼º
    ¿ì¸®´Â ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ ¿µ»ó ȹµæÀ» ½ÃÀÛÇϵµ·Ï ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼º ÇÒ °ÍÀÔ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ¹öư Çϳª¸¦ »ý¼ºÇÕ´Ï´Ù.


    3.

    thread º¯¼ö Ãß°¡
    true ÀÏ °æ¿ì thread¸¦ µ¿ÀÛÇϰí false ÀÏ °æ¿ì thread ¸¦ µ¿ÀÛÇÏÁö ¾Êµµ·Ï Çϱâ À§ÇØ »ç¿ëµÉ m_ThreadContinue¶ó´Â º¯¼ö¸¦ »ý¼ºÇÕ´Ï´Ù.


    4.

    thread »ý¼º
    AfxBeginThread()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© thread¸¦ »ý¼ºÇϰí Ȱ¼ºÈ­½Ã۱â À§ÇØ ¹Ì¸® »ý¼ºÇÑ ¹öưÀ» ´õºíŬ¸¯ÇÏ¿© À̺¥Æ®Ã³¸®±â¸¦ Ãß°¡ÇÏ°í ¾Æ·¡¿Í °°ÀÌ ¼Ò½º Äڵ带 ÀÛ¼ºÇÕ´Ï´Ù.

    void CFlyCapThrDlg::OnBnClickedContinuegrab()
    {
        // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
        m_ThreadContinue = true;
        CWinThread *pThread = ::AfxBeginThread(threadGrab, this);
    // thread »ý¼º
    }

    5.

    ÇÚµé º¯¼ö Ãß°¡
    thread Á¾·á ½Ã »ç¿ëµÇ´Â ÇÚµé À̺¥Æ®¸¦ À§ÇÑ º¯¼ö Ãß°¡ ÇÕ´Ï´Ù.


    6.

    ÇÚµé À̺¥Æ® »ý¼º
    thread Á¾·á ½Ã »ç¿ë µÉ ÇÚµé À̺¥Æ®¸¦ ¾Æ·¡¿Í °°ÀÌ »ý¼º ÇÕ´Ï´Ù.

    CFlyCapThrDlg::CFlyCapThrDlg(CWnd* pParent /*=NULL*/)
     : CDialog(CFlyCapThrDlg::IDD, pParent)
     , m_ThreadContinue(false)
    {
       m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
       m_heventThreadDone = CreateEvent(NULL, FALSE, FALSE, NULL); // ÇÚµé À̺¥Æ® »ý¼º
    }

    7.

    thread °¡ »ý¼ºµÇ¾î ¼öÇàµÉ ÇÔ¼ö »ý¼º
    thread¸¦ ½ÃÀÛÇÏ¿© ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ÇÔ¼ö¸¦ »ý¼ºÇÕ´Ï´Ù.


    8.

    thread ÇÔ¼ö ÄÚµå ÀÛ¼º
    thread°¡ »ý¼ºµÇ¾î ¼öÇàµÉ ÇÔ¼ö¿¡ ¾Æ·¡¿Í °°ÀÌ ¼Ò½º Äڵ带 ÀÛ¼ºÇÕ´Ï´Ù.

    UINT CFlyCapThrDlg::threadGrab(LPVOID pParam)
    {
       CFlyCapThrDlg* pDlg = ((CFlyCapThrDlg*) pParam);
       UINT Retval = pDlg ->GrabLoop();
       SetEvent(pDlg->m_heventThreadDone); // À̺¥Æ®¸¦ Set ÇÔ
       return Retval;

    }

     

    9.

    ¿¬¼Ó ¿µ»ó ȹµæÀÌ ¼öÇàµÉ ÇÔ¼ö »ý¼º
    thread µ¿ÀÛ ÈÄ ¿µ»óÀ» ¿¬¼ÓÀûÀ¸·Î ȹµæÇÏ´Â ÇÔ¼ö¸¦ »ý¼ºÇÕ´Ï´Ù.


    10.

    Ä«¸Þ¶ó µ¿ÀÛ¿¡ ÇÊ¿äÇÑ º¯¼ö Ãß°¡
    ´ÙÀ̾ó·Î±× Ŭ·¡½ºÀÇ Çì´õÆÄÀÏ¿¡ Ä«¸Þ¶ó µ¿ÀÛ ½Ã ÇÊ¿äÇÑ º¯¼ö¸¦ Ãß°¡ ÇÕ´Ï´Ù.

    public:
     FlyCaptureContext pContext;  // Context
     FlyCaptureImage pImage;  // À̹ÌÁö Á¤º¸ ±¸Á¶Ã¼
     FlyCaptureImage pImageBGR; // À̹ÌÁö Á¤º¸ ±¸Á¶Ã¼

     

    11.

    ¿¬¼Ó ¿µ»ó ȹµæ ÄÚµå ÀÛ¼º
    ¿¬¼ÓÀûÀ¸·Î ¿µ»óÀ» ȹµæÇÏ´Â Äڵ带 ÀÛ¼ºÇÕ´Ï´Ù.

    UINT CFlyCapThrDlg::GrabLoop(void)
    {
       // ¿µ»ó ȹµæÀ» À§ÇÑ FlyCapture API ÄÚµå
       FlyCaptureError error; // Error ÄÚµå ±¸Á¶Ã¼

       error = flycaptureCreateContext(&pContext); // Context »ý¼º
       error = flycaptureInitialize(pContext, 0); // Ä«¸Þ¶ó ÃʱâÈ­
       error = flycaptureStart( pContext, FLYCAPTURE_VIDEOMODE_ANY, FLYCAPTURE_FRAMERATE_ANY);

       pImageBGR.pixelFormat = FLYCAPTURE_BGR;
       pImageBGR.pData = new unsigned char[2248*2048*3];

       while(m_ThreadContinue)  // ¿¬¼ÓÀûÀ¸·Î À̹ÌÁö¸¦ ȹµæÇϱâ À§ÇÑ ¹Ýº¹
       {
          flycaptureGrabImage2(pContext,&pImage); // À̹ÌÁö ȹµæ
          flycaptureConvertImage(pContext,&pImage,&pImageBGR);
            // ȹµæÇÑ À̹ÌÁö RGB ÇüÅ·Πº¯È¯
          // FlyCapture API¸¦ ÅëÇÏ¿© ȹµæÇÑ ¿µ»óÀ» ´ÙÀ̾ó·Î±×¿¡ Display Çϱâ À§ÇÑ ÄÚµå

          CDC *pDC;
          BITMAPINFO bitmapInfo;

          pDC=GetDC();
          bitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
          bitmapInfo.bmiHeader.biPlanes=1;
          bitmapInfo.bmiHeader.biCompression=BI_RGB;
          bitmapInfo.bmiHeader.biXPelsPerMeter=100;
          bitmapInfo.bmiHeader.biYPelsPerMeter=100;
          bitmapInfo.bmiHeader.biClrUsed=0;
          bitmapInfo.bmiHeader.biClrImportant=0;
          bitmapInfo.bmiHeader.biWidth=pImage.iCols;
          bitmapInfo.bmiHeader.biHeight=-pImage.iRows;
          bitmapInfo.bmiHeader.biBitCount=24;
          bitmapInfo.bmiHeader.biSizeImage=0;

          ::StretchDIBits( pDC->GetSafeHdc(),0, 0, pImage.iCols, pImage.iRows, 0, 0, pImage.iCols, pImage.iRows, pImageBGR.pData, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY );

       }
       SetEvent(m_heventThreadDone); // À̺¥Æ®¸¦ Set ÇÔ
       return 0;

    }

    12. OnDestroy ÇÔ¼ö Ãß°¡
    ÇÁ·Î±×·¥ Á¾·á½Ã thread¸¦ Á¾·áÇϱâ À§ÇØ WM_DESTROY ¸Þ½ÃÁö¸¦ ÀÌ¿ëÇÏ¿© OnDestroyÇÔ¼ö¸¦ »ý¼º ÇÕ´Ï´Ù.

    13.

    thread Á¾·á À§ÇÑ ÄÚµå ÀÛ¼º
    »ý¼ºÇÑ OnDestroy ÇÔ¼ö¿¡ thread¸¦ Á¾·áÇϱâ À§ÇÑ Äڵ带 ÀÛ¼ºÇÕ´Ï´Ù.

    void CFlyCapThrDlg::OnDestroy()
    {
       CDialog::OnDestroy();

       // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
       m_ThreadContinue = false;

       DWORD dwRet = WaitForSingleObject(m_heventThreadDone, 3000);
         // m_heventThreadDoneÀÌ Set µÉ ¶§ ±îÁö 3ÃÊ µ¿¾È ±â´Ù¸²
       if(dwRet == WAIT_OBJECT_0) // °´Ã¼°¡ ½ÅÈ£»óŰ¡ µÇ¾úÀ» °æ¿ì ½ÇÇà
       {
          delete[] pImageBGR.pData;
          flycaptureStop(pContext); // Ä«¸Þ¶ó µ¿ÀÛ ¸ØÃã
          flycaptureDestroyContext(pContext);  // »ý¼ºµÈ Context ÆÄ±«
       }
       else
       {
          DWORD dwExitCode;
          ::GetExitCodeThread(m_heventThreadDone, &dwExitCode); // thread ExitCode ¾òÀ½
          TerminateThread(m_heventThreadDone, dwExitCode); // thread Á¾·á
          delete[] pImageBGR.pData;
          flycaptureStop(pContext);  // Ä«¸Þ¶ó µ¿ÀÛ ¸ØÃã
          flycaptureDestroyContext(pContext); // »ý¼ºµÈ Context ÆÄ±«
       }
       CloseHandle(m_heventThreadDone); // ÇÚµé Á¾·á

    }

    4. ÄÄÆÄÀÏ
    ÄÄÆÄÀÏ ÇÏ¿© Á¤»ó µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù.

      Link [¸ñ·Ï] [Step 2. ÇÑÀåÀÇ ¿µ»ó ȹµæ ÄÚµå ÀÛ¼º] [Step 4. Ä«¸Þ¶ó ÆÄ¶ó¸ÞÅÍ ¼³Á¤]