Skip to content

Instantly share code, notes, and snippets.

@ofTheo
Created October 9, 2014 03:23
Show Gist options
  • Save ofTheo/fd0e418530cba5af4d88 to your computer and use it in GitHub Desktop.
Save ofTheo/fd0e418530cba5af4d88 to your computer and use it in GitHub Desktop.
void findHomogrpahy( vector <ofVec2f> inPts, vector <ofVec2f> outPts, CvMat * homography){
homography = cvCreateMat(3,3,CV_32FC1);
CvPoint2D32f * srcPts = new CvPoint2D32f[ inPts.size() ];
CvPoint2D32f * dstPts = new CvPoint2D32f[ outPts.size() ];
for(int i = 0; i < inPts.size(); i++){
srcPts[i].x = inPts[i].x;
srcPts[i].y = inPts[i].y;
//cout << i << " srcPts is " << srcPts[i].x << " " << srcPts[i].y << endl;
}
for(int i = 0; i < outPts.size(); i++){
dstPts[i].x = outPts[i].x;
dstPts[i].y = outPts[i].y;
//cout << i << " dstPt is " << dstPts[i].x << " " << dstPts[i].y << endl;
}
CvMat cvsrc = cvMat(1, inPts.size(), CV_32FC2, srcPts);
CvMat cvdst = cvMat(1, outPts.size(), CV_32FC2, dstPts);
cvFindHomography(&cvsrc, &cvdst, homography, CV_RANSAC, 2);
bCallib = true;
delete [] srcPts;
delete [] dstPts;
}
ofPoint transform(ofPoint in, CvMat * homography){
if( bCallib == false ) return in;
float xIn = in.x;
float yIn = in.y;
ofPoint out;
float *data = homography->data.fl;
float a = data[0];
float b = data[1];
float c = data[2];
float d = data[3];
float e = data[4];
float f = data[5];
float i = data[6];
float j = data[7];
//from Myler & Weeks - so fingers crossed!
out.x = ((a*xIn + b*yIn + c) / (i*xIn + j*yIn + 1));
out.y = ((d*xIn + e*yIn + f) / (i*xIn + j*yIn + 1));
return out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment