

#include "opencv2/bioinspired.hpp" //   cv::Ptr<cv::bioinspired::Retina> cvRetina; //    //  void initRetina(cv::Mat* inputFrame) { cvRetina = cv::bioinspired::createRetina( inputFrame->size(), //    false, //   :    cv::bioinspired::RETINA_COLOR_DIAGONAL, //    false, //     1.0, //  .      10.0); //   //    cvRetina->write("RetinaDefaultParameters.xml"); //   cvRetina->setup("RetinaDefaultParameters.xml"); //   cvRetina->clearBuffers(); }  <?xml version="1.0"?> <opencv_storage> <OPLandIPLparvo> <colorMode>0</colorMode> <normaliseOutput>1</normaliseOutput> <photoreceptorsLocalAdaptationSensitivity>0.89e-001</photoreceptorsLocalAdaptationSensitivity> <photoreceptorsTemporalConstant>5.0000000000000000e-001</photoreceptorsTemporalConstant> <photoreceptorsSpatialConstant>1.2999997138977051e-001</photoreceptorsSpatialConstant> <horizontalCellsGain>0.3</horizontalCellsGain> <hcellsTemporalConstant>1.</hcellsTemporalConstant> <hcellsSpatialConstant>7.</hcellsSpatialConstant> <ganglionCellsSensitivity>0.89e-001</ganglionCellsSensitivity></OPLandIPLparvo> <IPLmagno> <normaliseOutput>1</normaliseOutput> <parasolCells_beta>0.1</parasolCells_beta> <parasolCells_tau>0.1</parasolCells_tau> <parasolCells_k>7.</parasolCells_k> <amacrinCellsTemporalCutFrequency>1.2000000476837158e+000</amacrinCellsTemporalCutFrequency> <V0CompressionParameter>5.4999998807907104e-001</V0CompressionParameter> <localAdaptintegration_tau>0.</localAdaptintegration_tau> <localAdaptintegration_k>7.</localAdaptintegration_k></IPLmagno> </opencv_storage>  //          #define CV_MOTION_DETECTOR_MEDIAN_FILTER_N 512 //    static float meanBuffer[CV_MOTION_DETECTOR_MEDIAN_FILTER_N]; static float entropyBuffer[CV_MOTION_DETECTOR_MEDIAN_FILTER_N]; //   static int numFrame = 0; //    float getMedianArrayf(float* data, unsigned long nData); //   // inputFrame -   RGB  CV_8UC3 // arrayBB -    void updateMotionDetector(cv::Mat* inputFrame,std::vector<cv::Rect2f>& arrayBB) { cv::Mat retinaOutputMagno; //    magno cv::Mat imgTemp; //     float medianEntropy, medianMean; //   cvRetina->run(*inputFrame); //     cvRetina->getMagno(retinaOutputMagno); //   ,     cv::imshow("retinaOutputMagno", retinaOutputMagno); //      ,      if (numFrame < CV_MOTION_DETECTOR_MEDIAN_FILTER_N) { numFrame++; } //       float mean = cv::mean(retinaOutputMagno)[0]; //   float entropy = calcEntropy(&retinaOutputMagno); //   if (numFrame >= 2) { //    //     //      for (i = numFrame - 1; i > 0; i--) { entropyBuffer[i] = entropyBuffer[i - 1]; } entropyBuffer[0] = entropy; //     //     //       for (i = numFrame - 1; i > 0; i--) { meanBuffer[i] = meanBuffer[i - 1]; } meanBuffer[0] = mean; //      medianEntropy = getMedianArrayf(entropyBuffer, numFrame); medianMean = getMedianArrayf(meanBuffer, numFrame); } else { medianEntropy = entropy; medianMean = mean; } //      ,    ,    // if (medianMean >= mean) { //    ,    ,    if ((medianEntropy * 0.85) >= entropy) { //    //  ,      //         // cv::threshold(retinaOutputMagno, imgTemp,150, 255.0, CV_THRESH_BINARY); //        cv::threshold(retinaOutputMagno, imgTemp,150, 255.0, CV_THRESH_BINARY); //   std::vector<std::vector<cv::Point>> contours; cv::findContours(imgTemp, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); if (contours.size() > 0) { //    arrayBB.resize(contours.size()); //    float xMax, yMax; float xMin, yMin; for (unsigned long i = 0; i < contours.size(); i++) { xMax = yMax = 0; xMin = yMin = imgTemp.cols; for (unsigned long z = 0; z < contours[i].size(); z++) { if (xMax < contours[i][z].x) { xMax = contours[i][z].x; } if (yMax < contours[i][z].y) { yMax = contours[i][z].y; } if (xMin > contours[i][z].x) { xMin = contours[i][z].x; } if (yMin > contours[i][z].y) { yMin = contours[i][z].y; } } arrayBB[i].x = xMin; arrayBB[i].y = yMin; arrayBB[i].width = xMax - xMin ; arrayBB[i].height = yMax - yMin; } } else { arrayBB.clear(); } } else { arrayBB.clear(); } //   retinaOutputMagno.release(); imgTemp.release(); } //    template<typename aData> void quickSort(aData* a, long l, long r) { long i = l, j = r; aData temp, p; p = a[ l + (r - l)/2 ]; do { while ( a[i] < p ) i++; while ( a[j] > p ) j--; if (i <= j) { temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } while ( i<=j ); if ( i < r ) quickSort(a, i, r); if ( l < j ) quickSort(a, l , j); }; //    float getMedianArrayf(float* data, unsigned long nData) { float medianData; float mData[nData]; register unsigned long i; if (nData == 0) return 0; if (nData == 1) { medianData = data[0]; return medianData; } for (i = 0; i != nData; ++i) { mData[i] = data[i]; } quickSort(mData, 0, nData - 1); medianData = mData[nData >> 1]; return medianData; }; 
Source: https://habr.com/ru/post/321618/
All Articles