//----------------------------------------------------------------------------- // Name: Render // Desc: //----------------------------------------------------------------------------- HRESULT CMyD3DApplication::Render() { HRESULT hr; if(FAILED(hr = m_pd3dDevice->BeginScene())) return hr; // Draw Environment FLOAT fAspectRatio = (FLOAT)m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height; D3DXMatrixPerspectiveFovRH(&m_matProjection, D3DXToRadian(60.0f), fAspectRatio, 0.1f, 2000.0f); m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProjection); if(m_bDrawEnvironment) { D3DXMATRIX mat(m_matView); mat._41 = mat._42 = mat._43 = 0.0f; m_pd3dDevice->SetTransform(D3DTS_VIEW, &mat); m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); m_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); m_Environment.Draw(); m_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); } else { m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); } m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); // Draw water if(m_bDrawWater) { // Setup matrices if(m_pEffect->IsParameterUsed("mENV")) { D3DXMATRIX matP(m_matPosition); matP._41 = matP._42 = matP._43 = 0.0f; D3DXMATRIX mat; D3DXMatrixScaling(&mat, 1.0f, 1.0f, -1.0f); D3DXMatrixMultiply(&mat, &matP, &mat); // matCube m_pEffect->SetMatrix("mENV", &mat); } // Draw water UINT uPasses; m_pEffect->Begin(&uPasses, 0); for(UINT uPass = 0; uPass < uPasses; uPass++) { m_pEffect->Pass(uPass); m_Water.DrawSurface(); } m_pEffect->End(); } // Show info m_pFont->DrawText( 2, 0, D3DCOLOR_ARGB(255,255,255,0), m_strFrameStats ); m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,255,0), m_strDeviceStats ); TCHAR szText[100]; wsprintf( szText, _T("Using Technique %d"), m_iTechnique ); m_pFontSmall->DrawText( 2, 40, D3DCOLOR_ARGB(255,255,100,100), szText ); if( m_bShowHelp ) { m_pFontSmall->DrawText( 2, 60, D3DCOLOR_ARGB(255,100,100,200), _T("Keyboard controls:") ); m_pFontSmall->DrawText( 20, 80, D3DCOLOR_ARGB(255,100,100,200), _T("Add Drop\n") _T("Next Technique\n") _T("Next Tech. (no validate)\n") _T("Prev Technique\n") _T("Prev Tech. (no validate)\n") _T("Move\nTurn\nPitch\nSlide\n") _T("Help\nChange device\nExit") ); m_pFontSmall->DrawText( 210, 80, D3DCOLOR_ARGB(255,100,100,200), _T("D\n") _T("PageDn\nShift-PageDn\n") _T("PageUp\nShift-PageUp\n") _T("W,S\nE,Q\nA,Z\nArrow keys\n") _T("F1\nF2\nEsc") ); } else { m_pFontSmall->DrawText( 2, 60, D3DCOLOR_ARGB(255,100,100,200), _T("Press F1 for help") ); } if(FAILED(hr = m_pd3dDevice->EndScene())) return hr; return S_OK; }
void ThinPlateSplineShapeTransformerImpl::estimateTransformation(InputArray _pts1, InputArray _pts2, std::vector<DMatch>& _matches ) { Mat pts1 = _pts1.getMat(); Mat pts2 = _pts2.getMat(); CV_Assert((pts1.channels()==2) && (pts1.cols>0) && (pts2.channels()==2) && (pts2.cols>0)); CV_Assert(_matches.size()>1); if (pts1.type() != CV_32F) pts1.convertTo(pts1, CV_32F); if (pts2.type() != CV_32F) pts2.convertTo(pts2, CV_32F); // Use only valid matchings // std::vector<DMatch> matches; for (size_t i=0; i<_matches.size(); i++) { if (_matches[i].queryIdx<pts1.cols && _matches[i].trainIdx<pts2.cols) { matches.push_back(_matches[i]); } } // Organizing the correspondent points in matrix style // Mat shape1((int)matches.size(),2,CV_32F); // transforming shape Mat shape2((int)matches.size(),2,CV_32F); // target shape for (int i=0, end = (int)matches.size(); i<end; i++) { Point2f pt1=pts1.at<Point2f>(0,matches[i].queryIdx); shape1.at<float>(i,0) = pt1.x; shape1.at<float>(i,1) = pt1.y; Point2f pt2=pts2.at<Point2f>(0,matches[i].trainIdx); shape2.at<float>(i,0) = pt2.x; shape2.at<float>(i,1) = pt2.y; } shape1.copyTo(shapeReference); // Building the matrices for solving the L*(w|a)=(v|0) problem with L={[K|P];[P'|0]} //Building K and P (Neede to buil L) Mat matK((int)matches.size(),(int)matches.size(),CV_32F); Mat matP((int)matches.size(),3,CV_32F); for (int i=0, end=(int)matches.size(); i<end; i++) { for (int j=0; j<end; j++) { if (i==j) { matK.at<float>(i,j)=float(regularizationParameter); } else { matK.at<float>(i,j) = distance(Point2f(shape1.at<float>(i,0),shape1.at<float>(i,1)), Point2f(shape1.at<float>(j,0),shape1.at<float>(j,1))); } } matP.at<float>(i,0) = 1; matP.at<float>(i,1) = shape1.at<float>(i,0); matP.at<float>(i,2) = shape1.at<float>(i,1); } //Building L Mat matL=Mat::zeros((int)matches.size()+3,(int)matches.size()+3,CV_32F); Mat matLroi(matL, Rect(0,0,(int)matches.size(),(int)matches.size())); //roi for K matK.copyTo(matLroi); matLroi = Mat(matL,Rect((int)matches.size(),0,3,(int)matches.size())); //roi for P matP.copyTo(matLroi); Mat matPt; transpose(matP,matPt); matLroi = Mat(matL,Rect(0,(int)matches.size(),(int)matches.size(),3)); //roi for P' matPt.copyTo(matLroi); //Building B (v|0) Mat matB = Mat::zeros((int)matches.size()+3,2,CV_32F); for (int i=0, end = (int)matches.size(); i<end; i++) { matB.at<float>(i,0) = shape2.at<float>(i,0); //x's matB.at<float>(i,1) = shape2.at<float>(i,1); //y's } //Obtaining transformation params (w|a) solve(matL, matB, tpsParameters, DECOMP_LU); //tpsParameters = matL.inv()*matB; //Setting transform Cost and Shape reference Mat w(tpsParameters, Rect(0,0,2,tpsParameters.rows-3)); Mat Q=w.t()*matK*w; transformCost=fabs(Q.at<float>(0,0)*Q.at<float>(1,1));//fabs(mean(Q.diag(0))[0]);//std::max(Q.at<float>(0,0),Q.at<float>(1,1)); tpsComputed=true; }
static Mat _localAffineEstimate(const std::vector<Point2f>& shape1, const std::vector<Point2f>& shape2, bool fullAfine) { Mat out(2,3,CV_32F); int siz=2*(int)shape1.size(); if (fullAfine) { Mat matM(siz, 6, CV_32F); Mat matP(siz,1,CV_32F); int contPt=0; for (int ii=0; ii<siz; ii++) { Mat therow = Mat::zeros(1,6,CV_32F); if (ii%2==0) { therow.at<float>(0,0)=shape1[contPt].x; therow.at<float>(0,1)=shape1[contPt].y; therow.at<float>(0,2)=1; therow.row(0).copyTo(matM.row(ii)); matP.at<float>(ii,0) = shape2[contPt].x; } else { therow.at<float>(0,3)=shape1[contPt].x; therow.at<float>(0,4)=shape1[contPt].y; therow.at<float>(0,5)=1; therow.row(0).copyTo(matM.row(ii)); matP.at<float>(ii,0) = shape2[contPt].y; contPt++; } } Mat sol; solve(matM, matP, sol, DECOMP_SVD); out = sol.reshape(0,2); } else { Mat matM(siz, 4, CV_32F); Mat matP(siz,1,CV_32F); int contPt=0; for (int ii=0; ii<siz; ii++) { Mat therow = Mat::zeros(1,4,CV_32F); if (ii%2==0) { therow.at<float>(0,0)=shape1[contPt].x; therow.at<float>(0,1)=shape1[contPt].y; therow.at<float>(0,2)=1; therow.row(0).copyTo(matM.row(ii)); matP.at<float>(ii,0) = shape2[contPt].x; } else { therow.at<float>(0,0)=-shape1[contPt].y; therow.at<float>(0,1)=shape1[contPt].x; therow.at<float>(0,3)=1; therow.row(0).copyTo(matM.row(ii)); matP.at<float>(ii,0) = shape2[contPt].y; contPt++; } } Mat sol; solve(matM, matP, sol, DECOMP_SVD); out.at<float>(0,0)=sol.at<float>(0,0); out.at<float>(0,1)=sol.at<float>(1,0); out.at<float>(0,2)=sol.at<float>(2,0); out.at<float>(1,0)=-sol.at<float>(1,0); out.at<float>(1,1)=sol.at<float>(0,0); out.at<float>(1,2)=sol.at<float>(3,0); } return out; }