⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calib3dwindow.cpp

📁 微软的基于HMM的人脸识别原代码, 非常经典的说
💻 CPP
📖 第 1 页 / 共 2 页
字号:

        x4 = -Box_W / 2;
        y4 =  Box_H / 2;
        z4 =  0;
        
        x5 =  Box_W / 2;
        y5 = -Box_H / 2;
        z5 =  Box_L;
        
        x6 = -Box_W / 2;
        y6 = -Box_H / 2;
        z6 =  Box_L;

        x7 =  Box_W / 2;
        y7 =  Box_H / 2;
        z7 =  Box_L;
        
        x8 = -Box_W / 2;
        y8 =  Box_H / 2;
        z8 =  Box_L;

        floorHeight = Box_H / 6;

        yfloor = - Box_H /2 - floorHeight;

        glMatrixMode(GL_PROJECTION);

        glLoadIdentity();
        glDepthRange(0,1.0);

        glOrtho(    -1,1,
                    -1,1,
                    -10,10);

        glRotatef(m_baseAlpha + m_alpha,0,1,0);
        glRotatef(m_baseBeta + m_beta,1,0,0);
        
        float setScale;
        setScale = m_baseScale + m_scale;
        
        glScalef(   setScale,
                    setScale,
                    setScale);

        glTranslatef(0, 0,- Box_L / 2.0f);

        /* Draw the room */
        
        glBegin(GL_LINE_STRIP);
        glColor3f(1,0,0);
        glVertex3f(x1,y1,z1);
        glVertex3f(x3,y3,z3);
        glVertex3f(x4,y4,z4);
        glVertex3f(x2,y2,z2);
        glVertex3f(x1,y1,z1);
        glVertex3f(x5,y5,z5);
        glVertex3f(x6,y6,z6);
        glVertex3f(x8,y8,z8);
        glVertex3f(x7,y7,z7);
        glVertex3f(x5,y5,z5);
        
        glEnd();

        glBegin(GL_LINES);

        glVertex3f(x3,y3,z3);
        glVertex3f(x7,y7,z7);
        
        glVertex3f(x4,y4,z4);
        glVertex3f(x8,y8,z8);

        glVertex3f(x2,y2,z2);
        glVertex3f(x6,y6,z6);

        glEnd();

        /* Draw floor for the room */

        /*  First draw the lines */
        glBegin(GL_LINES);
        glColor3f(0.0,1.0,0.0);
        glVertex3f(x1,y1,z1);
        glVertex3f(x5,y5,z5);

        glVertex3f(x5,y5,z5);
        glVertex3f(x6,y6,z6);

        glVertex3f(x6,y6,z6);
        glVertex3f(x2,y2,z2);

        glVertex3f(x2,y2,z2);
        glVertex3f(x1,y1,z1);

        glVertex3f(x1,y1,z1);
        glVertex3f(x1,yfloor,z1);

        glVertex3f(x1,yfloor,z1);
        glVertex3f(x5,yfloor,z5);

        glVertex3f(x5,yfloor,z5);
        glVertex3f(x6,yfloor,z6);

        glVertex3f(x6,yfloor,z6);
        glVertex3f(x2,yfloor,z2);

        glVertex3f(x2,yfloor,z2);
        glVertex3f(x1,yfloor,z1);
        glVertex3f(x2,y2,z2);
        glVertex3f(x2,yfloor,z2);
        glVertex3f(x6,y6,z6);
        glVertex3f(x6,yfloor,z6);
        glVertex3f(x5,y5,z5);
        glVertex3f(x5,yfloor,z5);
        glEnd();

        /* Draw floor under floor */
        glBegin(GL_QUADS);
        glColor3f(0.0f, 0.6f, 1.1f);

        glVertex3f(x1,yfloor,z1);
        glVertex3f(x5,yfloor,z5);
        glVertex3f(x6,yfloor,z6);
        glVertex3f(x2,yfloor,z2);
        glEnd();

        /* Draw walls under floor */
        glBegin(GL_QUADS);
        glColor3f(0.0f,0.3f,0.5f);

        glVertex3f(x1,y1,z1);
        glVertex3f(x5,y5,z5);
        glVertex3f(x5,yfloor,z5);
        glVertex3f(x1,yfloor,z1);

        glVertex3f(x5,y5,z5);
        glVertex3f(x6,y6,z6);
        glVertex3f(x6,yfloor,z6);
        glVertex3f(x5,yfloor,z5);

        glVertex3f(x2,y2,z2);
        glVertex3f(x6,y6,z6);
        glVertex3f(x6,yfloor,z6);
        glVertex3f(x2,yfloor,z2);

        glVertex3f(x1,y1,z1);
        glVertex3f(x2,y2,z2);
        glVertex3f(x2,yfloor,z2);
        glVertex3f(x1,yfloor,z1);

        glEnd();


        /* Draw the camera */
        float camX0,camX1,camX2,camX3,camX4;
        float camY0,camY1,camY2,camY3,camY4;
        float camZ0,camZ1,camZ2,camZ3,camZ4;

        camX0 =  0.0; camY0 =  0.0; camZ0 = 0.0;
        camX1 = -1.0; camY1 =  1.0; camZ1 = 4.0;
        camX2 =  1.0; camY2 =  1.0; camZ2 = 4.0;
        camX3 =  1.0; camY3 = -1.0; camZ3 = 4.0;
        camX4 = -1.0; camY4 = -1.0; camZ4 = 4.0;
/*
        glBegin(GL_TRIANGLE_FAN);
        glVertex3f(camX0,camY0,camZ0);
        glVertex3f(camX1,camY1,camZ1);
        glVertex3f(camX2,camY2,camZ2);
        glVertex3f(camX3,camY3,camZ3);
        glVertex3f(camX4,camY4,camZ4);
        glEnd();
*/        
        glBegin(GL_LINE_STRIP);
        glColor3f(1.0,0.0,0.0);
        glVertex3f(camX0,camY0,camZ0);
        glVertex3f(camX1,camY1,camZ1);
        glVertex3f(camX2,camY2,camZ2);
        glVertex3f(camX3,camY3,camZ3);
        glVertex3f(camX4,camY4,camZ4);
        glVertex3f(camX1,camY1,camZ1);
        glEnd();
        
        glBegin(GL_LINES);
        glVertex3f(camX0,camY0,camZ0);
        glVertex3f(camX2,camY2,camZ2);
        glVertex3f(camX0,camY0,camZ0);
        glVertex3f(camX3,camY3,camZ3);
        glVertex3f(camX0,camY0,camZ0);
        glVertex3f(camX4,camY4,camZ4);
        glEnd();

        /* draw direct to ground */

        glBegin(GL_LINES);
        glVertex3f(0,0,0);
        glVertex3f(0,-Box_H/2,0);
        glEnd();

        /* Draw flat ground */

        glBegin(GL_QUADS);
        glColor3f(1.0f, 0.6f, 0.1f);

        //glShadeModel(GL_FLAT);

        glVertex3f(x1,y1,z1);
        glVertex3f(x5,y5,z5);
        glVertex3f(x6,y6,z6);
        glVertex3f(x2,y2,z2);
        glEnd();
        
        /* Convert Points */

        for( t = 0; t < etalonNum; t++) {
        
            objPoint.data.fl[0] = objPoints.data.fl[t * 3 + 0];
            objPoint.data.fl[1] = objPoints.data.fl[t * 3 + 1];
            objPoint.data.fl[2] = objPoints.data.fl[t * 3 + 2];

            cvmMul( &cameraMatr, &objPoint, &tmp3 );
            
            cvmAdd( &tmp3, &transVect, &Point );

            // MirrorPoints !!!
            Points.data.fl[t*3+0] = -Point.data.fl[0];
            Points.data.fl[t*3+1] = -Point.data.fl[1];
            Points.data.fl[t*3+2] =  Point.data.fl[2];
        }

        
        /* Draw Object */
        glBegin(GL_QUADS);

        /* Draw black and white quads */
        float   xq[4];//1,xq2,xq3,xq4;
        float   yq[4];//1,yq2,yq3,yq4;
        float   zq[4];//,zq2,zq3,zq4;

        int     inds[4];//1,ind2,ind3,ind4;
        int     curr;

        for(t = 0; t < numY - 1; t++)
        {
            for(k = 0; k < numX - 1; k++)
            {
                inds[0] = t * numX + k;
                inds[1] = inds[0] + 1;
                inds[2] = inds[0] + numX + 1;
                inds[3] = inds[0] + numX;

                for( curr = 0; curr < 4; curr++ )
                {
                    xq[curr] = Points.data.fl[inds[curr] * 3 + 0];
                    yq[curr] = Points.data.fl[inds[curr] * 3 + 1];
                    zq[curr] = Points.data.fl[inds[curr] * 3 + 2];
                }

                if( (t + k & 1) == 1 )
                {
                    glColor3f(0.1f, 0.1f, 0.1f);
                }
                else
                {
                    glColor3f(1.0f, 1.0f, 1.0f);
                }

                for( curr = 0; curr < 4; curr++ )
                {
                    glVertex3f(xq[curr],yq[curr],zq[curr]);
                }
            }
        }

        glEnd();

        cvmFree(&objPoints);

        cvmFree(&Points   );
        cvmFree(&objPoint );
        cvmFree(&tmp3     );
        cvmFree(&Point    );
    }

    glFinish();
    glFlush();
    
    noerror = SwapBuffers(m_hdc);

    EndPaint( m_hwnd, &ps );

}/* OnPaint */


void CCalib3DWindow::OnLButtonDown( CvPoint pt, int /*fwKeys*/)
{
    m_oldLPoint = pt;
    SetCapture(m_hwnd);
    
    m_alpha = 0.0;
    m_beta = 0.0;

    m_holdLMouse = true;
    InvalidateRect( m_hwnd, 0, FALSE );
    UpdateWindow( m_hwnd );
}

void CCalib3DWindow::OnLButtonUp( CvPoint /*pt*/, int /*fwKeys*/)
{
    ReleaseCapture();
    m_holdLMouse = false;
    m_baseAlpha += m_alpha;
    m_baseBeta += m_beta;
    m_alpha = 0.0;
    m_beta = 0.0;
    InvalidateRect( m_hwnd, 0, FALSE );
    UpdateWindow( m_hwnd );
}

void CCalib3DWindow::OnRButtonDown( CvPoint pt, int /*fwKeys*/)
{
    m_oldRPoint = pt;
    SetCapture(m_hwnd);

    m_holdRMouse = true;

    m_scale = 0.0;
    InvalidateRect( m_hwnd, 0, FALSE );
    UpdateWindow( m_hwnd );
}

void CCalib3DWindow::OnRButtonUp( CvPoint /*pt*/, int /*fwKeys*/)
{
    ReleaseCapture();
    m_holdRMouse = false;
    
    m_baseScale += m_scale;
    if( m_baseScale <= 0.0) m_baseScale = 0.0;
    m_scale = 0.0;
    InvalidateRect( m_hwnd, 0, FALSE );
    UpdateWindow( m_hwnd );
}

void CCalib3DWindow::OnMouseMove( CvPoint pt, int /*fwKeys*/)
{
    if( m_holdLMouse )
    {
        RECT rect;
        GetClientRect( m_hwnd, &rect );
        float width  = (float)(rect.right  - rect.left);
        float height = (float)(rect.bottom - rect.top);

        float dx = (float)( pt.x - m_oldLPoint.x );
        float dy = (float)( pt.y - m_oldLPoint.y );
        m_alpha = (dx / width)  * 360;
        m_beta = (dy / height) * 360;
    }

    if( m_holdRMouse )
    {
        RECT rect;
        GetClientRect( m_hwnd, &rect );
        float height = (float)(rect.bottom - rect.top);
        float dy = (float)(pt.y - m_oldRPoint.y);
        m_scale = (float)((dy/height)*0.1);
    }
    
    InvalidateRect( m_hwnd, 0, FALSE );
    UpdateWindow( m_hwnd );
}

void CCalib3DWindow::Show( bool show )
{
    ShowWindow( m_hwnd, show ? SW_SHOWNORMAL : SW_HIDE );
}

/* End of file. */

CCalib3DWindow::Resize()
{
    RECT rect;
    GetClientRect( m_hwnd, &rect );

	glViewport(0,0,rect.right - rect.left,rect.bottom - rect.top);
	OnPaint();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -