#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup() { ofSetLogLevel(OF_LOG_WARNING); ofSetFrameRate(60); buffer.allocate(ofGetWidth(),ofGetHeight()); renderFBO.allocate(ofGetWidth(),ofGetHeight(),GL_RGB); //buffer.clear(); } //-------------------------------------------------------------- void ofApp::update() { ofSetWindowTitle(ofToString(ofGetFrameRate())); } //-------------------------------------------------------------- void ofApp::draw() { //rough out how it could be possible to perform an avs style glitch transform //within a drawing //drawing- to an fbo //distorting- from an opencv texture //how to get from an fbo to an opencv texture ofSetColor(255, 255, 255); renderFBO.begin(); buffer.draw(0,0); ofNoFill(); ofTranslate(ofGetWidth()/2,ofGetHeight()/2); ofRect(-20,-20,40,40); renderFBO.end(); renderFBO.readToPixels(buffer.getPixelsRef()); buffer.flagImageChanged(); cv::Mat buf = buffer.getCvImage(); cv::Mat dstbuf; //create low res remap target cv::Mat dstX(32,24,CV_32FC1); cv::Mat dstY(32,24,CV_32FC1); cv::Mat srcX(32,24,CV_32FC1); cv::Mat srcY(32,24,CV_32FC1); float xFactor=ofGetWidth()/dstX.rows; float yFactor=ofGetHeight()/dstX.cols; for (int i=0;i(i,j)=i*xFactor; dstY.at(i,j)=j*yFactor; } } //transform the low res matrix float tX=0; //fraction of image float tY=0; //fraction of image float oX=0; //fraction of image float oY=0; //fraction of image float s=0.99; float r=0.0; cv::Point2f srcTri[3], dstTri[3]; cv::Mat rot_mat(2,3,CV_32FC1); cv::Mat trans_mat(2,3,CV_32FC1); cv::Mat out_mat(3,3,CV_32FC1); // Compute matrix by creating triangle and transforming srcTri[0].x=0; srcTri[0].y=0; srcTri[1].x=dstX.rows-1; srcTri[1].y=0; srcTri[2].x=0; srcTri[2].y=dstX.cols-1; for (int i=0;i<3;i++){ dstTri[i].x=srcTri[i].x+(tX*dstX.cols); dstTri[i].y=srcTri[i].y+(tY*dstX.cols); //use cols for equiv coords //rotate and scale around centre //transform to centre dstTri[i].x-=(oX*dstX.cols); dstTri[i].y-=(oY*dstX.cols); dstTri[i].x*=s; dstTri[i].y*=s; double dx=(dstTri[i].x*cos(r))-(dstTri[i].y*sin(r)); double dy=(dstTri[i].x*sin(r))+(dstTri[i].y*cos(r)); dstTri[i].x=dx; dstTri[i].y=dy; //transform back dstTri[i].x+=(oX*dstX.cols); dstTri[i].y+=(oY*dstX.cols); } trans_mat=getAffineTransform( srcTri, dstTri ); warpAffine( srcX, dstX, trans_mat, srcX.size(), cv::INTER_NEAREST, cv::BORDER_WRAP); warpAffine( srcY, dstY, trans_mat, srcX.size(), cv::INTER_NEAREST, cv::BORDER_WRAP); cv::Mat scaledstX; cv::Mat scaledstY; cv::resize(dstX,scaledstX, cv::Size(ofGetWidth(),ofGetHeight()), 0, 0, cv::INTER_NEAREST); cv::resize(dstY,scaledstY, cv::Size(ofGetWidth(),ofGetHeight()), 0, 0, cv::INTER_NEAREST); cv::remap(buf,dstbuf,scaledstX,scaledstY, cv::INTER_LINEAR, cv::BORDER_WRAP, cv::Scalar(0,0, 0) ); IplImage *tmp = new IplImage(dstbuf); buffer=tmp; delete tmp; renderFBO.draw(0,0); //eventually textured into a viewport } //-------------------------------------------------------------- void ofApp::exit() { } //-------------------------------------------------------------- void ofApp::keyPressed (int key) { switch (key) { case OF_KEY_UP: break; case OF_KEY_DOWN: break; } } //-------------------------------------------------------------- void ofApp::mouseDragged(int x, int y, int button) {} //-------------------------------------------------------------- void ofApp::mousePressed(int x, int y, int button) {} //-------------------------------------------------------------- void ofApp::mouseReleased(int x, int y, int button) {} //-------------------------------------------------------------- void ofApp::windowResized(int w, int h) {}