/* Recursive function. Store local array */ long int rarray(long int x) { if (x <= 0) return x; volatile long int a[3]; a[1] = x-1; return rarray(x-2) + a[1]; }
bool CppIterCHT (vector < unsigned int >originImage, vector < unsigned int >dim_originImage, unsigned int maxR, vector < unsigned int >&edgeImage, vector < unsigned int >&dim_edgeImage, vector < unsigned int >&result_row, vector < unsigned int >&result_col, vector < unsigned int >&result_r, vector < unsigned int >&result_peak) { // result_row, result_col: based from 0. //mxArray *prhs[1], *plhs[1]; //double *tempGetPr; //mxLogical *tempGetLogicals; if (!(dim_originImage.size () == 2 && dim_edgeImage.size () == 2)) { #ifdef MATLABPRINT mexPrintf ("CppIterCHT ==> inputs are invalid, failed!\n"); #endif return false; } edgeImage.clear (); edgeImage.resize (originImage.size ()); copy (originImage.begin (), originImage.end (), edgeImage.begin ()); dim_edgeImage[0] = dim_originImage[0]; dim_edgeImage[1] = dim_originImage[1]; vector < unsigned int >accumulator (edgeImage.size (), 0); vector < unsigned int >rarray (edgeImage.size (), 0), peakarray (edgeImage.size (), 0); unsigned int currentrow, currentcol, edgecellnum = 0; //prhs[0]=mxCreateDoubleMatrix(dim_edgeImage[0], dim_edgeImage[1], mxREAL); // used for calling MATLAB function "imregionalmax" for (unsigned int rcount = 1; rcount <= maxR; rcount++) { accumulator.assign (accumulator.size (), 0); edgecellnum = 0; for (unsigned int pcount = 0; pcount < edgeImage.size (); pcount++) { if (edgeImage[pcount] != 0) // the pixel is on the edge { // draw circle with center at the pixel and radius rcount in accumulator. currentrow = MatrixLZ::ind2subrow (pcount, dim_edgeImage[0], dim_edgeImage[1], MatrixLZ::ColMajor); currentcol = MatrixLZ::ind2subcol (pcount, dim_edgeImage[0], dim_edgeImage[1], MatrixLZ::ColMajor); CppRasterCircle (currentcol + 1, currentrow + 1, rcount, accumulator, dim_edgeImage); edgecellnum += 1; } } for (unsigned int i = 0; i < accumulator.size (); i++) { if (accumulator[i] > peakarray[i]) { rarray[i] = rcount; peakarray[i] = accumulator[i]; } } //tempGetPr=mxGetPr(prhs[0]); //for (unsigned i=0; i<accumulator.size(); i++) //{ // tempGetPr[i]=static_cast<double>(accumulator[i]); //} //mexCallMATLAB(1, plhs, 1, prhs, "imregionalmax"); //tempGetLogicals=mxGetLogicals(plhs[0]); //for (unsigned int i=0; i<accumulator.size(); i++) //{ // if (tempGetLogicals[i] && accumulator[i]>peakarray[i]) // { // rarray[i]=rcount; // peakarray[i]=accumulator[i]; // } //} //mxDestroyArray(plhs[0]); } //mxDestroyArray(prhs[0]); unsigned int maxpeak; maxpeak = *(max_element (peakarray.begin (), peakarray.end ())); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // the threshold used to determine whether local peak indicates a // circle. If the local peak value is no less than maximum local peak // value and no less than 0.1*(number of cells on edge), it is deemed to // be a circle center in the image. result_row.clear (); result_col.clear (); result_r.clear (); result_peak.clear (); for (unsigned int i = 0; i < peakarray.size (); i++) { if (peakarray[i] >= 1 * maxpeak && peakarray[i] >= static_cast < unsigned int >(0.1 * edgecellnum + 0.5)) { currentrow = MatrixLZ::ind2subrow (i, dim_edgeImage[0], dim_edgeImage[1], MatrixLZ::ColMajor); currentcol = MatrixLZ::ind2subcol (i, dim_edgeImage[0], dim_edgeImage[1], MatrixLZ::ColMajor); result_row.push_back (currentrow); result_col.push_back (currentcol); result_r.push_back (rarray[i]); result_peak.push_back (peakarray[i]); } } return true; }