2008년 6월 9일 월요일

오후 6:58

원래 OpenCV에서 처리한 데이타는 Intel Image processing Library (IPL) 맞춰서 나옵니다. 그런데 이걸 일반적으로 윈도우에서 띄워 봐야 겠지요? OpenCV Yahoo group 보니까 이렇게 나와 있네요.

void  FillBitmapInfo1( BITMAPINFO* bmi, int width, int height, int bpp ) 
{
    BITMAPINFOHEADER* bmih = &(bmi->bmiHeader); 
    memset( bmih, 0, sizeof(*bmih)); 
    bmih->biSize   = sizeof(BITMAPINFOHEADER); 
    bmih->biWidth  = width; 
    bmih->biHeight = -abs(height); 
    bmih->biPlanes = 1; 
    bmih->biBitCount = bpp; 
    bmih->biCompression = BI_RGB; 
    if( bpp == 8 ) 
    { 
        RGBQUAD* palette = bmi->bmiColors; 
        int i; 
        for( i = 0; i < 256; i++ ) 
        { 
            palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i; 
            palette[i].rgbReserved = 0; 
        } 
    } 
} 
   
   
void ShowImage1( IplImage * src, HDC dc, int x, int y, int w, int h, 
                 int from_x, int from_y ) 
{ 
    if( src->width > 0 ) 
    { 
        uchar buffer[sizeof(BITMAPINFOHEADER) + 1024]; 
        BITMAPINFO* bmi = (BITMAPINFO*)buffer; 
        int bmp_w = src->width; 
        int bmp_h = src->height; 
   
        FillBitmapInfo1( bmi, bmp_w, bmp_h, src->nChannels*8 ); 
   
        int sw = MAX( MIN( bmp_w - from_x, w ), 0 ); 
        int sh = MAX( MIN( bmp_h - from_y, h ), 0 ); 
   
        int res = SetDIBitsToDevice( 
              dc,                        // handle to DC 
              x,                         // x-coord of destination upper-left corner 
              y,                         // y-coord of destination upper-left corner 
              sw,                        // source rectangle width 
              sh,                        // source rectangle height 
              from_x,                    // x-coord of source lower-left corner 
              from_y,                    // y-coord of source lower-left corner 
              from_y,                    // first scan line in array 
              sh,                        // number of scan lines 
              src->imageData + from_y*src->widthStep // array of DIB bits 
              (BITMAPINFO*)bmi,          // bitmap information 
              DIB_RGB_COLORS );          // RGB or palette indexes 
    } 
} 


     

이렇게 쓰면 되겠지요?

     
HDC  myDC= GetDC(0);  // THIS IS YOUR DESKTOP-WINDOW
                      //ADJUST IT TO YOUR WINDOW

ShowImage1(your_img ,myDC,0,0,100,100,0,0);
                      //ADJUST TO YOUR NEEDS


GetDC()
자기가 원하는 윈도우의 Handle DeviceContext 돌려주는 것이니 원하는 윈도우의 Handle
인자로 넣어 주시면 됩니다. 윈도우 API설명이 궁금하시면 Petzold Programming Windows 참고하세요.
번역본 역시 있습니다.

Programming Windows, 5/E : The Definitive Guide to the Win32 API - Petzold, Charles

실제 사용 법

HDC myDC= ::GetDC(m_hWnd);  // THIS IS YOUR DESKTOP-WINDOW
                            //ADJUST IT TO YOUR WINDOW
    
ShowImage1(ShowOrg ,myDC,10,10,320,240,0,0);        //ADJUST TO YOUR NEEDS
ShowImage1(ShowMark ,myDC,350,10,160,160,0,0);        //ADJUST TO YOUR NEEDS

::ReleaseDC(m_hWnd,myDC);

신고
Posted by Frys

티스토리 툴바