static void *handleTemperaturePressure (void *data) { double temperature; double pressure; time_t sec; double sample = 1200; //trigger time (second) for trend time_t initial = time (NULL) ; double delta ; for (;;){ if(bmp085_Calibration(fd) > 0 ){ temperature = bmp085_GetTemperature(bmp085_ReadUT(fd)); sleep(1); pressure = bmp085_GetPressure(bmp085_ReadUP(fd)); int press = round(pressure/100); int temp = round(temperature/10); updateTemp (temp) ; updatePressure (press) ; sleep(4) ; //Wait 4s to avoid concurrent access sec = time (NULL); delta = difftime(sec, initial); if (delta > sample ){ trend (press); initial = time(NULL); sleep (1); } } sleep (2); } return 0; }
void Logic::drawPage0() { _display->setCursor(0, 0); _display->print("Z:"); _display->print(_zasilanie); _display->print(" "); _display->print(trend(_zasilanie, _prevZasilanie)); _display->setCursor(0, 10); _display->print("G:"); _display->print(_gora); _display->print(" "); _display->print(trend(_gora, _prevGora)); _display->setCursor(0, 20); _display->print("D:"); _display->print(_dol); _display->print(" "); _display->print(trend(_dol, _prevDol)); _display->setCursor(0, 30); _display->print("*"); if (_load) { _display->print("lad"); } }
int TrackThread::process(Mat &frame,Mat &output) { int re=0; cvtColor (frame,gray,CV_BGR2GRAY); frame.copyTo (output); //特征点太少了,重新检测特征点 //if(points[0].size ()<=10) { goodFeaturesToTrack (gray,//图片 features,//输出特征点 max_count,//特征点最大数目 qlevel,//质量指标 minDist);//最小容忍距离 //插入检测到的特征点 // points[0].insert (points[0].end (),features.begin (),features.end ()); // initial.insert (initial.end (),features.begin (),features.end ()); points[0]=features; initial=features; } //第一帧 if(gray_prev.empty ()){ gray.copyTo (gray_prev); } //根据前后两帧灰度图估计前一帧特征点在当前帧的位置 //默认窗口是15*15 calcOpticalFlowPyrLK ( gray_prev,//前一帧灰度图 gray,//当前帧灰度图 points[0],//前一帧特征点位置 points[1],//当前帧特征点位置 status,//特征点被成功跟踪的标志 err);//前一帧特征点点小区域和当前特征点小区域间的差,根据差的大小可删除那些运动变化剧烈的点 int k = 0; //去除那些未移动的特征点 for(int i=0;i<points[1].size();i++){ if(acceptTrackedPoint (i)) { initial[k]=initial[i]; points[1][k++] = points[1][i]; } } points[1].resize (k); initial.resize (k); //标记被跟踪的特征点 for(int i=0;i<points[1].size ();i++) { //当前特征点到初始位置用直线表示 line(output,initial[i],points[1][i],Scalar(20,150,210)); //当前位置用圈标出 circle(output,points[1][i],3,Scalar(120,250,10)); } if(points[1].size()!=0) trend(output); //向心速度 curx*=0.9; cury*=0.9; lens=min(output.rows,output.cols)/8; edge=min(output.rows,output.cols)/5; //控制域 rectangle(output, Point(output.cols/2-lens,output.rows/2-lens), Point(output.cols/2+lens,output.rows/2+lens), Scalar(1,100,200),3); //追踪域 rectangle(output, Point(edge,edge), Point(output.cols-edge,output.rows-edge), Scalar(10,210,1),3); if(first){ if(dirx==1){ re=4; line(output, Point(output.cols/2+lens,output.rows/2-lens), Point(output.cols/2+lens,output.rows/2+lens), Scalar(20,250,110),5); } else if(dirx==-1){ re=3; line(output, Point(output.cols/2-lens,output.rows/2-lens), Point(output.cols/2-lens,output.rows/2+lens), Scalar(20,250,110),5); } if(diry==1){ re=2; line(output, Point(output.cols/2-lens,output.rows/2+lens), Point(output.cols/2+lens,output.rows/2+lens), Scalar(20,250,110),5); } else if(diry==-1){ re=1; line(output, Point(output.cols/2-lens,output.rows/2-lens), Point(output.cols/2+lens,output.rows/2-lens), Scalar(20,250,110),5); } } //为下一帧跟踪初始化特征点集和灰度图像 circle(output,Point(output.cols/2+curx,output.rows/2+cury),10,Scalar(2,1,250),3); std::swap(points[1],points[0]); cv::swap(gray_prev,gray); return re; }
bool RtDesignMatrix::buildDesignMatrix() { numAddedColumns = 0; // TODO this will need to get called by unserializeXML as well // fill the rest of the measurements as periodic stim if (loadDesignMatrixFromFile) { if (padConditionWithZeros) { // TODO } else { unsigned int i = blockLen - 1; for (; i < numMeas; i++) { inputConditions.put( i, numInputConditions - 1, inputConditions.get( i % blockLen, numInputConditions - 1)); } } } // the rest was originally in build() // setup the size unsigned int numConditions = getNumConditionBases(); unsigned int numNuisance = getNumNuisanceBases(); columnNames.clear(); columnNames.reserve(numConditions + numNuisance); set_size(numMeas, numConditions + numNuisance); // set neural condition regressors buildHrf(); // store the new condition names as we go along vector<string> inputConditionNames = conditionNames; // build shifted delta for potential condition shifting vnl_vector<double> shiftdelta(numMeas, 0.0); if (conditionShift > 0 && conditionShift < numMeas) { shiftdelta.put(conditionShift, 1); } else { shiftdelta.put(0, 1); } // consider each input condition individually for (unsigned int cond = 0; cond < numConditions; cond++) { vnl_vector<double> basis = inputConditions.get_column(cond); // incorporate condition shift via convolution with shifted delta if (conditionShift > 0 && conditionShift < numMeas) { vnl_vector<double> shiftcol = vnl_convolve(basis, shiftdelta); basis.update(shiftcol.extract(basis.size())); } // build block-wise condition vectors if required if (modelEachBlock) { unsigned int numBlocks = ceil((double) ((numMeas - conditionShift) / blockLen)); // create a design matrix column per block for (unsigned int block = 0; block <= numBlocks; block++) { vnl_vector<double> blockCol(numMeas, 0); // copy the entire block from the input condition vector for (unsigned int meas = conditionShift + block * blockLen; meas < conditionShift + (block + 1) * blockLen && meas < numMeas; meas++) { blockCol.put(meas, basis[meas]); } string blockStr; RtConfigVal::convertToString<unsigned int>(blockStr, block); addColumn(convolveVecWithHrf(blockCol), inputConditionNames[cond] + "_block" + blockStr, conditionInterestIndicator[cond]); // add columns for temporal derivatives if required if (modelTemporalDerivatives) { addColumn(convolveVecWithTemporalDerivative(blockCol), inputConditionNames[cond] + "_block" + blockStr + "_deriv", conditionInterestIndicator[cond]); } } } else { // no block splitting necessary addColumn(convolveVecWithHrf(basis), inputConditionNames[cond], conditionInterestIndicator[cond]); // add columns for temporal derivatives if required if (modelTemporalDerivatives) { addColumn(convolveVecWithTemporalDerivative(basis), inputConditionNames[cond] + "_deriv", conditionInterestIndicator[cond]); } } } // build the nuisance columns // fill the trend colums for (unsigned int i = 0; i <= maxTrendOrder; i++) { vnl_vector<double> trend(numMeas, 0); for (unsigned int j = 0; j < numMeas; j++) { switch (i) { case 0: // mean trend.put(j, 1.0); break; case 1: // linear trend.put(j, j + 1); break; default: // higher trend.put(j, pow((double) j - numMeas / 2, (int) i)); break; } } string order; RtConfigVal::convertToString(order, i); addColumn(trend, string("trend_order_") + order, false); } // name the motion columns vnl_vector<double> motStub(numMeas, 0); if (modelMotionParameters) { addColumn(motStub, "motion_tx", false); addColumn(motStub, "motion_ty", false); addColumn(motStub, "motion_tz", false); addColumn(motStub, "motion_rx", false); addColumn(motStub, "motion_ry", false); addColumn(motStub, "motion_rz", false); } // event and artifact columns will be left blank until they are received // check number of conditions against filled columns if (numAddedColumns != numNuisance + numConditions) { cerr << "WARNING: number of columns generated (" << numAddedColumns << ") is different from that expected (" << numNuisance + numConditions << "). further calculations are suspect." << endl; } if (DEBUG_LEVEL & MODERATE) { print(); } built = true; return true; }