void ImgGeo::setPrincipalAxes() { // PURPOSE: Set principal axes // RETURNS: None axisMax = sqrt(prinMax/getMoment(0,0)); axisMin = sqrt(prinMin/getMoment(0,0)); }
void ImgGeo::setCentroid() { // PURPOSE: Sets mean x and y - the centroid location // RETURNS: None ctrX = getMoment(1,0)/getMoment(0,0); ctrY = getMoment(0,1)/getMoment(0,0); }
void ImgGeo::setPrincipalMoments() { // PURPOSE: Sets principal moments // RETURNS: None // Init vars double o2x = getMoment(2,0); double o2y = getMoment(0,2); double o1xy = getMoment(1,1); // Set principal moments prinMax = 0.5*(o2x + o2y) + 0.5*sqrt(pow(o2x,2) + pow(o2y,2) - 2*o2x*o2y + 4*pow(o1xy,2)); prinMin = 0.5*(o2x + o2y) - 0.5*sqrt(pow(o2x,2) + pow(o2y,2) - 2*o2x*o2y + 4*pow(o1xy,2)); }
void ImgGeo::setOrientation() { // PURPOSE: Set angle of orientation // RETURNS: None // Init vars double o2x = getMoment(2,0); double o2y = getMoment(0,2); double o1xy = getMoment(1,1); double tanX,tanY; tanX = (prinMax - o2x)/o1xy; tanY = (prinMax - o2y)/o1xy; orienTheta = atan2(tanY,tanX); }
float Continuous::getMomentCore(int iMoment, const Ensemble& iEnsemble, const Parameters& iParameters) const { // TODO: Not tested const Variable* var = Variable::get(iEnsemble.getVariable()); float total = 0; float minX = var->getMin(); float maxX = var->getMax(); int nX = 1000; float dX = (maxX - minX)/((float) nX); float c = 0; if(iMoment > 1) { // Compute center of moment c = getMoment(1, iEnsemble, iParameters); } for(int i = 0; i < nX; i++) { float x = minX + i*dX; float pdf = getPdf(x, iEnsemble, iParameters); if(!Global::isValid(pdf)) return Global::MV; total += pow(x - c, iMoment) * pdf; } return total * dX; }
//============================================================================== // Note: Taken from Springer Handbook, chapter 2.2.11 void Inertia::computeSpatialTensor() { Eigen::Matrix3d C = math::makeSkewSymmetric(mCenterOfMass); // Top left mSpatialTensor.block<3,3>(0,0) = getMoment() + mMass*C*C.transpose(); // Bottom left mSpatialTensor.block<3,3>(3,0) = mMass*C.transpose(); // Top right mSpatialTensor.block<3,3>(0,3) = mMass*C; // Bottom right mSpatialTensor.block<3,3>(3,3) = mMass*Eigen::Matrix3d::Identity(); }
int main() { CvCapture* capture = 0; printf("Initializing Capture...\n"); // capture = cvCreateFileCapture("http://192.168.1.100/videostream.cgi?user=admin&pwd=123456"); capture = cvCaptureFromCAM( CV_CAP_ANY ); printf("Camera found\n"); if(!capture){printf("Could not initialize camera...\n");} printf("Capture Success!!!\n"); cvNamedWindow("Video", CV_WINDOW_AUTOSIZE); cvResizeWindow("Video", 640,480); cvMoveWindow("Video", 0,100); cvNamedWindow("HSV",CV_WINDOW_AUTOSIZE); cvNamedWindow("ROI"); cvMoveWindow("ROI", 700,100); int state = 0; int track = 1; int change= 2; int reset = 3; int clear = 4; while(1) { // Hold frame captured from camera IplImage* img = cvQueryFrame(capture); if(!img){printf("Image Query Failed");break;} key = cvWaitKey(10); if(key=='t'){state = track;} if(key=='c'){state = change;} if(key=='r'){state = reset;} if(key=='q'){state = clear;} key = cvWaitKey(10); if(state == track) { printf("Tracking\n"); imgRed = getThresholdImage(img); imgPos = getMoment(img); } key = cvWaitKey(10); if(state == change) { cvRectangle(img,cvPoint(250,300),cvPoint(400,200),CV_RGB(255,0,0),5,8); cvWaitKey(30); cvShowImage("Video",img); //printf("Getting Color\n"); IplImage* imgColor = getColor(img); state = 0; } key = cvWaitKey(10); if(state == reset) { printf("Resetting\n"); minC = hsv_min; maxC = hsv_max; state = 0; } if(state == clear) { printf("Paused\n"); state = 0; } else { key = cvWaitKey(10); } cvShowImage("HSV", imgRed); cvShowImage("Video", img); cvReleaseImage(&imgPos); cvReleaseImage(&imgRed); if ( (cvWaitKey(10) & 255) == 27 ) break; //key = cvWaitKey(10); } cvDestroyWindow("Video"); cvDestroyWindow("HSV"); cvDestroyWindow("ROI"); cvReleaseCapture(&capture); }