/** * A +-------------+ B * / \ * / \ * / \ * D +-------------------- + C */ void ofCvImage::warpPerspective( const ofPoint& A, const ofPoint& B, const ofPoint& C, const ofPoint& D ) { // compute matrix for perspectival warping (homography) CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; CvMat* translate = cvCreateMat( 3,3, CV_32FC1 ); cvSetZero( translate ); cvsrc[0].x = 0; cvsrc[0].y = 0; cvsrc[1].x = width; cvsrc[1].y = 0; cvsrc[2].x = width; cvsrc[2].y = height; cvsrc[3].x = 0; cvsrc[3].y = height; cvdst[0].x = A.x; cvdst[0].y = A.y; cvdst[1].x = B.x; cvdst[1].y = B.y; cvdst[2].x = C.x; cvdst[2].y = C.y; cvdst[3].x = D.x; cvdst[3].y = D.y; cvWarpPerspectiveQMatrix( cvsrc, cvdst, translate ); // calculate homography cvWarpPerspective( cvImage, cvImageTemp, translate ); swapTemp(); cvReleaseMat( &translate ); }
//-------------------------------------------------------------------------------- void ofxCvImage::warpIntoMe( ofxCvImage& mom, const ofPoint src[4], const ofPoint dst[4] ){ if( !bAllocated ){ ofLogError("ofxCvImage") << "warpIntoMe(): image not allocated"; return; } if( !mom.bAllocated ){ ofLogError("ofxCvImage") << "warpIntoMe(): source image not allocated"; return; } if( mom.getCvImage()->nChannels == cvImage->nChannels && mom.getCvImage()->depth == cvImage->depth ) { // compute matrix for perspectival warping (homography) CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; CvMat* translate = cvCreateMat( 3, 3, CV_32FC1 ); cvSetZero( translate ); for (int i = 0; i < 4; i++ ) { cvsrc[i].x = src[i].x; cvsrc[i].y = src[i].y; cvdst[i].x = dst[i].x; cvdst[i].y = dst[i].y; } cvWarpPerspectiveQMatrix( cvsrc, cvdst, translate ); // calculate homography cvWarpPerspective( mom.getCvImage(), cvImage, translate); flagImageChanged(); cvReleaseMat( &translate ); } else { ofLogError("ofxCvImage") << "warpIntoMe(): image type mismatch"; } }
//-------------------------------------------------------------------------------- void ofxCvImage::warpPerspective( const ofPoint& A, const ofPoint& B, const ofPoint& C, const ofPoint& D ) { if( !bAllocated ){ ofLogError("ofxCvImage") << "warpPerspective(): image not allocated"; return; } // compute matrix for perspectival warping (homography) CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; CvMat* translate = cvCreateMat( 3,3, CV_32FC1 ); cvSetZero( translate ); cvdst[0].x = 0; cvdst[0].y = 0; cvdst[1].x = width; cvdst[1].y = 0; cvdst[2].x = width; cvdst[2].y = height; cvdst[3].x = 0; cvdst[3].y = height; cvsrc[0].x = A.x; cvsrc[0].y = A.y; cvsrc[1].x = B.x; cvsrc[1].y = B.y; cvsrc[2].x = C.x; cvsrc[2].y = C.y; cvsrc[3].x = D.x; cvsrc[3].y = D.y; cvWarpPerspectiveQMatrix( cvsrc, cvdst, translate ); // calculate homography cvWarpPerspective( cvImage, cvImageTemp, translate ); swapTemp(); flagImageChanged(); cvReleaseMat( &translate ); }
//--------------------------- void coordWarping::calculateMatrix(ofxPoint2f src[4], ofxPoint2f dst[4]){ cvSetZero(translate); cvSetZero(itranslate); for (int i = 0; i < 4; i++){ cvsrc[i].x = src[i].x; cvsrc[i].y = src[i].y; cvdst[i].x = dst[i].x; cvdst[i].y = dst[i].y; } cvWarpPerspectiveQMatrix(cvsrc, cvdst, translate); // calculate homography cvWarpPerspectiveQMatrix(cvdst, cvsrc, itranslate); // calculate homography }
//--------------------------- void coordWarping::calculateMatrix(ofxPoint2f src[4], ofxPoint2f dst[4]){ cvSetZero(translate); for (int i = 0; i < 4; i++){ cvsrc[i].x = src[i].x; cvsrc[i].y = src[i].y; cvdst[i].x = dst[i].x; cvdst[i].y = dst[i].y; } cvWarpPerspectiveQMatrix(cvsrc, cvdst, translate); // calculate homography int n = translate->cols; float *data = translate->data.fl; }
//------------------------------------------------------------------------------------- void ofCvColorImage::warpIntoMe(ofCvColorImage &mom, ofPoint2f src[4], ofPoint2f dst[4]){ // compute matrix for perspectival warping (homography) CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; CvMat *translate = cvCreateMat(3,3,CV_32FC1); cvSetZero(translate); for (int i = 0; i < 4; i++){ cvsrc[i].x = src[i].x; cvsrc[i].y = src[i].y; cvdst[i].x = dst[i].x; cvdst[i].y = dst[i].y; } cvWarpPerspectiveQMatrix(cvsrc, cvdst, translate); // calculate homography cvWarpPerspective( mom.getCvImage(), cvImage, translate); cvReleaseMat(&translate); }
void margDisplay::clearTranslateMat() { CvPoint2D32f src[4]; CvPoint2D32f dst[4]; src[0].x = 0; src[0].y = 0; src[1].x = width; src[1].y = 0; src[2].x = width; src[2].y = height; src[3].x = 0; src[3].y = height; for(int i = 0; i < 4; i++) { dst[i] = src[i]; } cvWarpPerspectiveQMatrix(src, dst, translate); }
//-------------------------------------------------------------------------------- void ofxCvImage::warpIntoMe( ofxCvImage& mom, const ofPoint src[4], const ofPoint dst[4] ){ if( mom.getCvImage()->nChannels == cvImage->nChannels && mom.getCvImage()->depth == cvImage->depth ) { // compute matrix for perspectival warping (homography) CvPoint2D32f cvsrc[4]; CvPoint2D32f cvdst[4]; CvMat* translate = cvCreateMat( 3, 3, CV_32FC1 ); cvSetZero( translate ); for (int i = 0; i < 4; i++ ) { cvsrc[i].x = src[i].x; cvsrc[i].y = src[i].y; cvdst[i].x = dst[i].x; cvdst[i].y = dst[i].y; } cvWarpPerspectiveQMatrix( cvsrc, cvdst, translate ); // calculate homography cvWarpPerspective( mom.getCvImage(), cvImage, translate); flagImageChanged(); cvReleaseMat( &translate ); } else { ofLog(OF_LOG_ERROR, "in warpIntoMe: mom image type has to match"); } }