#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