www.pudn.com > roadextr.rar > strline.cpp
/* ------------------------------------------------------------------------------ Automatic extraction of edges and straight line segments from gray image. 2000,May ---------------------------------------------------------------------------------- */ #include "stdafx.h" #include "valdef.h" #include "strline.h" #include "SolveEquation.h" //#include "nrml.h" //#include "rdextr.h" //#include "LineTemplateMatch.h" #include#include /* --------------------------------------------------------------------------------------------------- Adaptive Least Square Template Matching ------------------------------------------------------------------------------------------------------- */ //BOOL A_LSTM_EdgeLineRectify(unsigned char *pucImg,int nRow,int nCol,double dfLengthLimt, // dfPOINT *pdfptIn,dfPOINT *pdfptOut,double dfDltLimt) //{ // int *pnTemp,rr,cc,nRange,c,m,r,dwTimes,maxPr; // int i,nTempH,nTempW,nEdgeW,j,jj; // double gy,maxd,thta,h0,h1,sint,cost,pdfD[4],pdfPara[10],d,*pdfcc,*pdflc,*pdfaa,maxpp,pp; // double xx0,yy0,xx,yy,pdfVx[1],pdfVy[1],pdfH0[1],pdfH1[1],dfP,pdfXX[2],pdfYY[2],vv; // unsigned char pucTemp_0[51],pucTemp_1[51],pucTemp_2[51],pucTemp_3[51],pucNewTmp[51]; // unsigned char *pucStrLine; // // nRange = 17; /// 15 // nEdgeW = 8; // nTempH = 2*nEdgeW + 1; // nTempW = 3; // //// genertae default templates I(x) = 1/(1+exp(-a*x)); // for(i=0;i =nRow) rr = nRow-1; // if(cc<0) cc =0; if(cc>=nCol) cc = nCol-1; // // *(pucStrLine+(nRange+r)*nTempW+m)=*(pucImg+rr*nCol+cc); // } // } // for(j=0;j<4;j++)//// find maximized template // { // for(r=0;r fabs(maxpp)) // { maxpp = pp; // maxPr = r; // jj = j; // } // // } // } // if(fabs(maxpp) < 0.8 ) // continue; // /////// generate new template // if(jj==0) // { if(maxpp<0) // ReversTemp(pucTemp_0,nTempH,nTempW); // ReturnH0H1(pucStrLine+maxPr*nTempW,pucTemp_0,nTempH*nTempW,pdfH0,pdfH1); // ReGenerateTemp(pucNewTmp,pucTemp_0,nTempH*nTempW,*pdfH0,*pdfH1); // } // if(jj==1) // { if(maxpp<0) // ReversTemp(pucTemp_1,nTempH,nTempW); // ReturnH0H1(pucStrLine+maxPr*nTempW,pucTemp_1,nTempH*nTempW,pdfH0,pdfH1); // ReGenerateTemp(pucNewTmp,pucTemp_1,nTempH*nTempW,*pdfH0,*pdfH1); // } // if(jj==2) // { if(maxpp<0) // ReversTemp(pucTemp_2,nTempH,nTempW); // ReturnH0H1(pucStrLine+maxPr*nTempW,pucTemp_2,nTempH*nTempW,pdfH0,pdfH1); // ReGenerateTemp(pucNewTmp,pucTemp_2,nTempH*nTempW,*pdfH0,*pdfH1); // } // if(jj==3) // { if(maxpp<0) // ReversTemp(pucTemp_3,nTempH,nTempW); // ReturnH0H1(pucStrLine+maxPr*nTempW,pucTemp_3,nTempH*nTempW,pdfH0,pdfH1); // ReGenerateTemp(pucNewTmp,pucTemp_3,nTempH*nTempW,*pdfH0,*pdfH1); // } // for(r=-nEdgeW;r<=nEdgeW;r++) // { for(m=0;m 20) //// // break; // dwTimes++; // } // ///// output // for(i=0;i<2;i++) // { pdfptOut[i].dfX = pdfPara[2*i]; // pdfptOut[i].dfY = pdfPara[2*i+1]; // } // // delete pdfcc; // delete pdflc; // delete pdfaa; // return TRUE; //} // //void ReversTemp(BYTE *pucTemp,int nTempH,int nTempW) //{ // BYTE *pucTemp2; // pucTemp2 = new BYTE[nTempH*nTempW]; // for(int n=0;n =nCol) // nStX = nCol-nW; // if(dfDetRange+dfptInput.dfY>=nRow) // nStY = (int)nRow-nH; // if(dfptInput.dfX-dfDetRange<=0) // nStX=0; // if(dfptInput.dfY-dfDetRange<=0) // nStY=0; // x0 = dfptInput.dfX-nStX; // y0 = dfptInput.dfY-nStY; // // pucI = (unsigned char *)malloc((nW+10)*nH*sizeof(char)); // // GetImgBlock2(pucImg,nCol,pucI,nH,nW,nStY,nStX); ///* // int nWid = 9; // float maxIntr,intr; // int nXX,nYY; // maxIntr = -100000000; // // for(r=nWid/2;r maxIntr) // { maxIntr = intr; // nXX = c; nYY = r; // } // } // pCornerPt[0].dfptCorner.dfX=nStX+nXX; // pCornerPt[0].dfptCorner.dfY=nStY+nYY; // delete pucI; // return 1; // //*/ // pLineSeg = (StraightLineSeg *)malloc(500*sizeof(StraightLineSeg)); // // nLineSegC = DetectStrLineSeg_Gray(pucI,nH,nW,0.1,30,30,pLineSeg,13,13,1.2); ///* // for(m=0;m 1) // cosa = 1.0; // a = acos(cosa); // */ // // if(fabs(fabs(t1-t2)-PI/2) x; // y = pCornerPt[nCC].dfptCorner.dfY = pdfptPOut->y; // d = sqrt((x0-x)*(x0-x)+(y0-y)*(y0-y)); // if(d>10) // continue; // d = 1.0/d; ////所求角点到输入点的距离的倒数为权 // pCornerPt[nCC].dfWei = d; // dd[0] = sqrt((xx1-x)*(xx1-x)+(yy1-y)*(yy1-y)); // dd[1] = sqrt((x-xx4)*(x-xx4)+(y-yy4)*(y-yy4)); // dd[2] = sqrt((xx2-x)*(xx2-x)+(yy2-y)*(yy2-y)); // dd[3] = sqrt((xx3-x)*(xx3-x)+(yy3-y)*(yy3-y)); // // if(dd[0] d) // { n = m; // d = pCornerPt[m].dfWei; // } // } // /////改变 // ////交换 // pt1.dfX = pCornerPt[n].dfptCorner.dfX; pt1.dfY = pCornerPt[n].dfptCorner.dfY; // pt2.dfX = pCornerPt[n].dfptInterSect1.dfX; pt2.dfY = pCornerPt[n].dfptInterSect1.dfY; // pt3.dfX = pCornerPt[n].dfptInterSect2.dfX; pt2.dfY = pCornerPt[n].dfptInterSect2.dfY; // pCornerPt[n].dfptCorner.dfX = pCornerPt[0].dfptCorner.dfX; // pCornerPt[n].dfptCorner.dfY = pCornerPt[0].dfptCorner.dfY; // pCornerPt[n].dfptInterSect1.dfX = pCornerPt[0].dfptInterSect1.dfX; // pCornerPt[n].dfptInterSect1.dfY = pCornerPt[0].dfptInterSect1.dfY; // pCornerPt[n].dfptInterSect2.dfX = pCornerPt[0].dfptInterSect2.dfX; // pCornerPt[n].dfptInterSect2.dfY = pCornerPt[0].dfptInterSect2.dfY; // pCornerPt[0].dfptCorner.dfX = pt1.dfX; pCornerPt[0].dfptCorner.dfY = pt1.dfY; // pCornerPt[0].dfptInterSect1.dfX = pt2.dfX; pCornerPt[0].dfptInterSect1.dfY = pt2.dfY; // pCornerPt[0].dfptInterSect2.dfX = pt2.dfX; pCornerPt[0].dfptInterSect2.dfY = pt2.dfY; // // // for(m=0;m x; // y = pdfptPOut->y; // // dd[0] = sqrt((xx1-x)*(xx1-x)+(yy1-y)*(yy1-y)); // st-m // dd[1] = sqrt((x-xx4)*(x-xx4)+(y-yy4)*(y-yy4)); // end-n // dd[2] = sqrt((xx2-x)*(xx2-x)+(yy2-y)*(yy2-y)); // end-m // dd[3] = sqrt((xx3-x)*(xx3-x)+(yy3-y)*(yy3-y)); // st-n // // if( min(dd[0],dd[2])>TooDistant||min(dd[1],dd[3])>TooDistant // 角点离交出该交点的直线端点的距离过大 // ||fabs(t1-t2)>BigAngle||fabs(t1-t2) =dd[1]&&pnnr[n]!=1)) // { pfptCrossL[nL].x = x; pfptCrossL[nL].y = y; nl[nL] = n; // nlLRFlag[nL] = dd[3] dd[2]&&pnnr[m]!=1) // { if((dd[3] =dd[1]&&pnnr[n]!=1)) // { pfptCrossR[nR].x = x; pfptCrossR[nR].y = y; nr[nR] = n; // nrLRFlag[nR] = dd[3] 0) // 第一条线的某个端点方向只有一个距离该端点最近的角点 // { // for(i=0;i 0) // if(nR>0)//// 第一条线的某个端点方向只有一个距离该端点最近的角点 // { // for(i=0;i 0) // }//for(m=0;m 50?20:0.4*d1; // sL = 10; // for(n=m+1;n dfDisDlta) ///// 两线段的距离过大 // continue; // dt = fabs(t1-t2); // if(dt>dfThtaDlta&&dt dfThtaDlta&&fabs(t1-tm) d2) // { d2 = dd[j]; // k=j; // } // } // switch(k) // { case 0 : x1 = xx1; y1 = yy1; x2 = xx3; y2 = yy3; break; // case 1 : x1 = xx1; y1 = yy1; x2 = xx4; y2 = yy4; break; // case 2 : x1 = xx2; y1 = yy2; x2 = xx3; y2 = yy3; break; // case 3 : x1 = xx2; y1 = yy2; x2 = xx4; y2 = yy4; break; // } // dd[0] = min(dd[0],dd[1]); dd[0] = min(dd[0],dd[2]); // dd[0] = min(dd[0],dd[3]); // if(dd[0]>sL) ////超出感知范围 // continue; // ///// 符合条件:两线段合并 // pLineSeg2[nCC].nptSt.dfX = x1; pLineSeg2[nCC].nptEnd.dfX = x2; // pLineSeg2[nCC].nptSt.dfY = y1; pLineSeg2[nCC].nptEnd.dfY = y2; // nCC++; // pLineSeg[m].nFlag = DELETED; ///合并后的两线段标记为删除 // pLineSeg[n].nFlag = DELETED; // break; // } // if(pLineSeg[m].nFlag!=DELETED)////如果未合并,记录孤立的该条线段 // { pLineSeg2[nCC].nptSt.dfX = xx1; // pLineSeg2[nCC].nptSt.dfY = yy1; // pLineSeg2[nCC].nptEnd.dfX = xx2; // pLineSeg2[nCC].nptEnd.dfY = yy2; // nCC++; // } // // } // ///// 删除一些短线 // // nN=0; // for(j=0;j 8*(i+1)*/d1>15) // { pLineSeg[nN].nptSt.dfX = pLineSeg2[j].nptSt.dfX; // pLineSeg[nN].nptSt.dfY = pLineSeg2[j].nptSt.dfY; // pLineSeg[nN].nptEnd.dfX = pLineSeg2[j].nptEnd.dfX; // pLineSeg[nN].nptEnd.dfY = pLineSeg2[j].nptEnd.dfY; // pLineSeg[nN].nFlag = UNDELETED; // nN++; // } // } // nSegCount = nN; // // } // free(pLineSeg2); // // return nSegCount; //} // ///* // get the gradients and their directions of extracted straight-segment pixels automatically //INPUT: // unsigned char *pucImg,int nRow,int nCol ----- image // StraightLineSeg *pLineSeg ---------------------- straight line segment structure //OUTPUT: // pLineSeg[n].pdfGrad ---------------- the pointer of gradients // pLineSeg[n].pdfGradDir ---------------- the pointer of gradient directions //*/ //BOOL GetGradientofStrLineSeg(unsigned char *pucImg,int nRow,int nCol, // StraightLineSeg *pLineSeg, // int nSegCount) //{ int i,j,m,n,r,c,y,nC; // double gx,gy,g,dir; // // for(n=0;n 2) // { // minx = miny = 1000000; // maxx = maxy = -1; // for(n=0;n maxx) // maxx=x; // if(y>maxy) // maxy = y; // } // h = maxy-miny; // w = maxx-minx; // sr = miny; // sc = minx; // for(n=0;n 0&&*(pucImg+r*nCol+c-1)!=BROARD_PT) // *(pucImg+r*nCol+c) = BROARD_PT; // } // } // else // { k = dy/dx; // b = y1-k*x1; // t = atan(k); // if(dy==0) // { r = y1; // for(j=0;fabs(j)<(int)fabs(dx);j+=dc) // { c = j+x1; // *(pucImg+r*nCol+c) = BROARD_PT; // } // } // else // { for(j=0;fabs(j)<(int)fabs(dy);j+=dr) // { c =(int)(((j+y1)-b)/k); // r = j+y1; // *(pucImg+r*nCol+c) = BROARD_PT; // } // } // } // } // ///// 行扫描算法 // for(i=0;i =pfGrad[(I1+1)*3+J1+1]&&pfGrad[4]>=pfGrad[(I2+1)*3+J2+1]) // { ///输出边缘点 // if((*(pucI2+r*nCol+c)!=0) // && (pfGrad[4] > 2 ) ) ///// pucGradTh[nSumGray] // { // *(pucI2+r*nCol+c) = *(pucI+r*nCol+c); // *(pucI2+(r+I1)*nCol+c+J1) = *(pucI2+(r+I2)*nCol+c+J2)= 0; // } // else // *(pucI2+r*nCol+c) = 0; // } // else // *(pucI2+r*nCol+c) = 0; // } // } // for(r=0;r fabs((double)nGy)?fabs((double)nGx):fabs((double)nGy); // *(pucI1+r*nCol+c) = (unsigned char)(int)G; // *(pucI2+r*nCol+c) = (signed char)(int)(2*127*fDir/PI); // } // } // //// memcpy(pucI1,pucImg,nCol*nRow*sizeof(char)); // //// Sobel2(pucI1,nRow,nCol,0); /// Sobel 算子得到梯度大小 // // for(r=2;r =pfGrad[(I1+1)*3+J1+1]&&pfGrad[4]>=pfGrad[(I2+1)*3+J2+1]) // { ///输出边缘点 // if(pfGrad[4]>MAX_GRAD) // {// *(pucI+r*nCol+c) = *(pucI1+r*nCol+c); // *(pucI+(r+I1)*nCol+c+J1) = *(pucI+(r+I2)*nCol+c+J2)= 0; // } // else // *(pucI+r*nCol+c) = 0; // } // else // *(pucI+r*nCol+c) = 0; // } // } // for(r=0;r =nRow-1||cc<1||cc>=nCol-1) break; pucN8[7]=*(pucImg+(rr-1)*nCol+cc+1); pucN8[6]=*(pucImg+(rr-1)*nCol+cc); pucN8[5]=*(pucImg+(rr-1)*nCol+cc-1); pucN8[4]=*(pucImg+rr*nCol+cc-1); pucN8[3]=*(pucImg+(rr+1)*nCol+cc-1); pucN8[2]=*(pucImg+(rr+1)*nCol+cc); pucN8[1]=*(pucImg+(rr+1)*nCol+cc+1); pucN8[0]=*(pucImg+rr*nCol+cc+1); ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; nEnd2Fg=0; nFg2=0; for(k=0;k<8;k++) { /*if(lsSeg.nPtC>1) for(kk=2;kk 1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY) /* nEnd2Fg=1; } if(nEnd2Fg==1)*/ continue; if(pucN8[k]==0) { nFg2=1; lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; n++; lsSeg.nPtC=n; } if(nFg2==1) break; } if(lsSeg.nPtC>nST) break; if(lsSeg.nPtC<=nST) { if(nFg2==0/*&&lsSeg.nPtC<=nST*/) { for(m=0;m =nRow-1||cc<1||cc>=nCol-1) break; if(n>=MAX_CURVE_POINT_COUNT) break; pucN8[7]=*(pucImg+(rr-1)*nCol+cc+1); pucN8[6]=*(pucImg+(rr-1)*nCol+cc); pucN8[5]=*(pucImg+(rr-1)*nCol+cc-1); pucN8[4]=*(pucImg+rr*nCol+cc-1); pucN8[3]=*(pucImg+(rr+1)*nCol+cc-1); pucN8[2]=*(pucImg+(rr+1)*nCol+cc); pucN8[1]=*(pucImg+(rr+1)*nCol+cc+1); pucN8[0]=*(pucImg+rr*nCol+cc+1); ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; nEnd2Fg=0; nFg2=0; for(k=0;k<8;k++) { if(lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)///若为已经记录的点 continue; if(pucN8[k]!=255)////记录一点 { nFg2=1; lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; n++; lsSeg.nPtC=n; } if(nFg2==1) break; } // if(lsSeg.nPtC>nST) // break; if(nFg2==0)////没有记录相邻点(is the end point!) { ///restore the points to Curve // pCurve[nCurveC].pnptPxy = (nPOINT *)malloc((lsSeg.nPtC)*sizeof(nPOINT)); pCurve[nCurveC].pnptPxy = new nPOINT[lsSeg.nPtC]; pCurve[nCurveC].nPtC = lsSeg.nPtC; for(m=0;m =nRow-1||cc<1||cc>=nCol-1) break; if(n>=MAX_CURVE_POINT_COUNT) break; pucN8[7]=*(pucImg+(rr-1)*nCol+cc+1); pucN8[6]=*(pucImg+(rr-1)*nCol+cc); pucN8[5]=*(pucImg+(rr-1)*nCol+cc-1); pucN8[4]=*(pucImg+rr*nCol+cc-1); pucN8[3]=*(pucImg+(rr+1)*nCol+cc-1); pucN8[2]=*(pucImg+(rr+1)*nCol+cc); pucN8[1]=*(pucImg+(rr+1)*nCol+cc+1); pucN8[0]=*(pucImg+rr*nCol+cc+1); ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; nEnd2Fg=0; nFg2=0; for(k=0;k<8;k++) { if((lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)|| (lsSeg.nPtC>2&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-3].nX &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-3].nY))///若为已经记录的点 continue; if(pucN8[k]!=255)////记录一点 { nFg2=1; lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; n++; lsSeg.nPtC=n; } if(nFg2==1) break; } // if(lsSeg.nPtC>nST) // break; ///如果回到起点,则跟踪结束 if(nFg2==0||(lsSeg.pnptPxy[n-1].nX==x0&& lsSeg.pnptPxy[n-1].nY==y0))////没有记录相邻点(is the end point!)||回到起点 { ///restore the points to Curve // pCurve[nCurveC].pnptPxy = (nPOINT *)malloc((lsSeg.nPtC)*sizeof(nPOINT)); pCurve[nCurveC].pnptPxy = new nPOINT[lsSeg.nPtC]; pCurve[nCurveC].nPtC = lsSeg.nPtC; for(m=0;m =nRow-1||cc<1||cc>=nCol-1) // break; // if(n>=MAX_CURVE_POINT_COUNT) // break; // pucN8[7]=*(pucImg+(rr-1)*nCol+cc+1); pucN8[6]=*(pucImg+(rr-1)*nCol+cc); // pucN8[5]=*(pucImg+(rr-1)*nCol+cc-1); pucN8[4]=*(pucImg+rr*nCol+cc-1); // pucN8[3]=*(pucImg+(rr+1)*nCol+cc-1); pucN8[2]=*(pucImg+(rr+1)*nCol+cc); // pucN8[1]=*(pucImg+(rr+1)*nCol+cc+1); pucN8[0]=*(pucImg+rr*nCol+cc+1); // // ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; // ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; // ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; // ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; // nEnd2Fg=0; // nFg2=0; // for(k=0;k<8;k++) // { if(lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX // &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)///若为已经记录的点 // continue; // // if(pucN8[k]!=255)////记录一点 // { nFg2=1; // lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; // lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; // // n++; // lsSeg.nPtC=n; // } // if(nFg2==1) // break; // } // // if(lsSeg.nPtC>nST) // // break; // // if(nFg2==0 /* && lsSeg.nPtC > (int)fLmt */)////没有记录相邻点(is the end point!) // { ///restore the points to Curve // // pCurve[nCurveC].pnptPxy = (nPOINT *)malloc((lsSeg.nPtC)*sizeof(nPOINT)); // if(lsSeg.nPtC > (int)fLmt) // { // pCurve[nCurveC].pnptPxy = new nPOINT[lsSeg.nPtC]; // pCurve[nCurveC].nPtC = lsSeg.nPtC; // // for(m=0;m =nRow-1||cc<1||cc>=nCol-1) // break; // if(n>=MAX_CURVE_POINT_COUNT) // break; // pucN8[7]=*(pucImg+(rr-1)*nCol+cc+1); pucN8[6]=*(pucImg+(rr-1)*nCol+cc); // pucN8[5]=*(pucImg+(rr-1)*nCol+cc-1); pucN8[4]=*(pucImg+rr*nCol+cc-1); // pucN8[3]=*(pucImg+(rr+1)*nCol+cc-1); pucN8[2]=*(pucImg+(rr+1)*nCol+cc); // pucN8[1]=*(pucImg+(rr+1)*nCol+cc+1); pucN8[0]=*(pucImg+rr*nCol+cc+1); // // ppntNPix[7].nX=cc+1; ppntNPix[7].nY=rr-1; ppntNPix[6].nX=cc; ppntNPix[6].nY=rr-1; // ppntNPix[5].nX=cc-1; ppntNPix[5].nY=rr-1; ppntNPix[4].nX=cc-1; ppntNPix[4].nY=rr; // ppntNPix[3].nX=cc-1; ppntNPix[3].nY=rr+1; ppntNPix[2].nX=cc; ppntNPix[2].nY=rr+1; // ppntNPix[1].nX=cc+1; ppntNPix[1].nY=rr+1; ppntNPix[0].nX=cc+1; ppntNPix[0].nY=rr; // nEnd2Fg=0; // nFg2=0; // for(k=0;k<8;k++) // { if((lsSeg.nPtC>1&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-2].nX // &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-2].nY)|| // (lsSeg.nPtC>2&&(ppntNPix[k].nX)==lsSeg.pnptPxy[lsSeg.nPtC-3].nX // &&(ppntNPix[k].nY)==lsSeg.pnptPxy[lsSeg.nPtC-3].nY))///若为已经记录的点 // continue; // // if(pucN8[k]!=255)////记录一点 // { nFg2=1; // lsSeg.pnptPxy[n].nX=ppntNPix[k].nX; // lsSeg.pnptPxy[n].nY=ppntNPix[k].nY; // // n++; // lsSeg.nPtC=n; // } // if(nFg2==1) // break; // } // // if(lsSeg.nPtC>nST) // // break; // ///如果回到起点,则跟踪结束 // if( nFg2==0 // ||(lsSeg.pnptPxy[n-1].nX==x0&& lsSeg.pnptPxy[n-1].nY==y0) ) ////没有记录相邻点(is the end point!)||回到起点 // { ///restore the points to Curve // // pCurve[nCurveC].pnptPxy = (nPOINT *)malloc((lsSeg.nPtC)*sizeof(nPOINT)); // if( lsSeg.nPtC > (int)fLmt) // { pCurve[nCurveC].pnptPxy = new nPOINT[lsSeg.nPtC]; // pCurve[nCurveC].nPtC = lsSeg.nPtC; // // for(m=0;m =nRow-2||c<2||c>=nCol-2) *(pucImg+r*nCol+c) = 255; } } DeleteShortBanch(pucImg,nRow,nCol,nST); // DelCornerPtBinLineImg(pucImg,nRow,nCol); nStrSegC = 0; pCurve = (LineSeg *)malloc(MAX_CURVE_SEG_COUNT*sizeof(LineSeg)); pdfX = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// middel result pdfY = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// middel result pdfX2 = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// added pdfY2 = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// added pdfXX = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// added pdfYY = (double *)malloc(MAX_CURVE_POINT_COUNT*sizeof(double));/// added if(!pdfX||!pdfY||!pdfX2||!pdfY2) return -1; //// nCurveC = TraceSingleWidthCurve(pucImg,nRow,nCol,pCurve); for(n=0;n =nLengthMin) { nCC=pnNo[i+1]-pnNo[i]+1; /////Attention: release the memory!! pLineSeg[nStrSegC].pdfptP = (dfPOINT *)malloc(nCC*sizeof(dfPOINT)); for(m=0;m 10.0)///if the 接近90度 // { c=s=cos(PI/4); t = 1.0; // ////将坐标系旋转45度 // for(n=0;n = dfThresh) { pcNo[index] = 1;/// Add it to the index if(index-nStNo>1)///前半部分递归 CompressALine02(pdfX,pdfY, index-nStNo+1,dfThresh,nStNo,index,pcNo); if(nEndNo-index>1)///后半部分递归 CompressALine02(pdfX,pdfY, nEndNo-index+1,dfThresh,index,nEndNo,pcNo); } return nRetPtC; } /* 密集点列的压缩: 分裂--拟合法(sprit-fitting) */ int CmprsLine02(double *pdfX,double *pdfY, ///------- input points int nPtCount, double dfThresh /// ---- error limit in vertical direction of str line ) { int nRetPtC,i; char *pcNo; double *pdfXM,*pdfYM,pdfMaxD[3]; pcNo= new char[nPtCount]; pdfXM = new double[nPtCount];/// middel result pdfYM = new double[nPtCount]; if(pdfXM==NULL||pdfYM==NULL||pcNo==NULL) return -1; for(i=0;i dfMaxD) { dfMaxD = vm; n=i; } } *pdfMaxD = dfMaxD; return n; } //BOOL HilditchThin2(BYTE *pucImg,int nImgRow,int nImgCol) //{ // BYTE *pucI; // int r,c,s,xx,yy,x,k,nrn,n[10]; // // // pucI = (BYTE *)malloc((long)nImgRow*nImgCol*sizeof(BYTE)); // if(!pucI) // return FALSE; // // /* binarylize */ // for(r=0;r x = ( dx0*dx2*(pt[2].y-pt[0].y) + dx2*dy0*pt[0].x - dx0*dy2*pt[2].x ) / // ( dx2*dy0 - dx0*dy2 ); // // interPt->y = ( dy0*dy2*(pt[0].x-pt[2].x) + dx2*dy0*pt[2].y - dx0*dy2*pt[0].y ) / // ( dx2*dy0 - dx0*dy2 ); // // return TRUE; //} // //BOOL CrossPtOf2StraightLine_2(dfPOINT* pt, dfPOINT* interPt) //{ //// fPoint interPt; // double dx0, dx2, dy0, dy2; // // dx0 = pt[1].dfX-pt[0].dfX; // dy0 = pt[1].dfY-pt[0].dfY; // dx2 = pt[3].dfX-pt[2].dfX; // dy2 = pt[3].dfY-pt[2].dfY; // // if(dx2*dy0 == dx0*dy2)//平行 // { // return FALSE; // } // // interPt->dfX = ( dx0*dx2*(pt[2].dfY-pt[0].dfY) + dx2*dy0*pt[0].dfX - dx0*dy2*pt[2].dfX ) / // ( dx2*dy0 - dx0*dy2 ); // // interPt->dfY = ( dy0*dy2*(pt[0].dfX-pt[2].dfX) + dx2*dy0*pt[2].dfY - dx0*dy2*pt[0].dfY ) / // ( dx2*dy0 - dx0*dy2 ); // // return TRUE; //} // // // ///* 二维坐标变换: // dfX0,dfY0 -------- 在原坐标系下的新原点坐标 // dfThta ----------- 新坐标系的旋转角 // dfXin,dfYin ----- 输入新坐标系下的一点的X,Y // *pdfXout,*pdfYout --- 输出该点在老坐标系下的坐标 //*/ //BOOL RetCordFromNewtoOld(double dfX0,double dfY0, // double dfThta,double dfXin, // double dfYin,double *pdfXout, // double *pdfYout) //{ *pdfXout = dfX0 + dfXin*cos(dfThta) - dfYin*sin(dfThta); // *pdfYout = dfY0 + dfYin*cos(dfThta) + dfXin*sin(dfThta); // // return TRUE; //} ///* // //*/ //BOOL RectifyStraightEdgeSeg(unsigned char *pucImg, // int nRow,int nCol,double dfMaxBias, // dfPOINT *pdfptIn,dfPOINT *pdfptOut, // double dfDltLimt) //{ double d,Dltai,Dlta,maxDlt,dfMaxY,xc,yr,dir, // pdfK[3],pdfB[3],x0,y0,x1,y1,dfThta,yrr,xx,yy; // double *pdfX,*pdfY,*pdfX2,*pdfY2,pdfXout[3],pdfYout[3]; // int i,ii,r,c,n,G,GMax,nN,nC,nGx,nGy,nC2,nCLimt,*pnNo; // unsigned char *pucFg; // //// if(fabs(dfMaxBias)>PI/4) //// return FALSE; // if(pdfptIn[0].dfX<=pdfptIn[1].dfX) // { // x0 = pdfptIn[0].dfX; y0 = pdfptIn[0].dfY; // x1 = pdfptIn[1].dfX; y1 = pdfptIn[1].dfY; // } // else // { // x0 = pdfptIn[1].dfX; y0 = pdfptIn[1].dfY; // x1 = pdfptIn[0].dfX; y1 = pdfptIn[0].dfY; // } // // d = sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)); // nCLimt =(int)(d*0.75); // nN = (int)(d+2); // dfMaxY = fabs(dfMaxBias); // if(d<=30.0) // return FALSE; // if(dfMaxY<1.0) // return FALSE; // if(d<10) // return FALSE; // // pdfX = (double *)malloc(nN*sizeof(double)); // pdfY = (double *)malloc(nN*sizeof(double)); // pdfX2 = (double *)malloc(nN*sizeof(double)); // pdfY2 = (double *)malloc(nN*sizeof(double)); // pucFg = (unsigned char *)malloc(nN*sizeof(char)); // pnNo = (int *)malloc(nN*sizeof(int)); // for(n=0;n =nRow-1||c<=0||c>=nCol-1) // G = 0; // else // { nGx = ((int)(*(pucImg+(r)*nCol+c+1)) // -*(pucImg+(r)*nCol+c-1))/2; // nGy = ((int)(*(pucImg+(r+1)*nCol+c)) // -*(pucImg+(r-1)*nCol+c))/2; // G = (int)sqrt(nGx*nGx+nGy*nGy); // dir = (nGx==0)?PI/2:atan((double)nGy/nGx); // } // if(/*fabs((dir+PI/2)-dfThta)>PI/10.0||*/G==0) // continue; // else // { if(yr==-dfMaxY||G>GMax) // { GMax = G; // yrr = yr; // } // } // } // *(pdfX+nC) = xc; // *(pdfY+nC) = yrr; // nC++; // } // //// 叠代拟合 // for(;;) // { nC2 = 0; // for(i=0;i Dlta) // *(pucFg+(*(pnNo+i))) = 0; // } //*/ // *(pucFg+(*(pnNo+ii))) = 0; //// 下次拟合驱除最大方差点 // // } // //// 输出纠正后的直线段 // xx = 0.0; ////起点 // yy = pdfB[0]; // // RetCordFromNewtoOld(x0,y0,dfThta,xx,yy,pdfXout,pdfYout); ////换回老坐标 // // pdfptOut[0].dfX = pdfXout[0]; // pdfptOut[0].dfY = pdfYout[0]; ///// // // xx = d; // yy = (pdfK[0])*(xx)+pdfB[0]; // // RetCordFromNewtoOld(x0,y0,dfThta,xx,yy,pdfXout,pdfYout); // // pdfptOut[1].dfX = pdfXout[0]; // pdfptOut[1].dfY = pdfYout[0]; // // // free(pdfX);free(pdfY); // free(pdfX2);free(pdfY2); // free(pucFg); free(pnNo); // // return TRUE; // //} ///* // 最小二乘直线模板匹配 //*/ //BOOL RectifyStraightEdgeSeg2(unsigned char *pucImg, // int nRow,int nCol,double dfLengthLimt, // dfPOINT *pdfptIn, ///// 输入两点的坐标 // dfPOINT *pdfptOut, //// 输出两点的坐标 // double dfDltLimt) //{ int i,j,n,m,No[3],r,c,rr,cc,maxPr,nInPtC,nN,nRange,nTempW,nTempH; // unsigned long dwTimes; // double pdfD[100],pdfDX[100],pdfDY[100],pdfPara[100],pdfH0[3],pdfH1[3];////Dxi,Dyi 的改正数 // double *pdfcc,*pdflc,*pdfaa,dfP,pdfVx[3],pdfVy[3],maxpp,pp,pdfXX[3],pdfYY[3]; // double gy,dij,xi,yi,xj,yj,maxd,thta,h0,h1,sint,cost,xx,yy,d,xx0,yy0,maxLastd; // unsigned char *pucStrLineTemp,*pucStrLine,ucG,pucStrLineTempNew[100]; // // // nInPtC = 2; // for(i=0;i<2;i++) // { pdfD[2*i] = 0.0; // pdfD[2*i+1] = 0.0; // pdfPara[2*i] = pdfptIn[i].dfX; // pdfPara[2*i+1] = pdfptIn[i].dfY; // } // No[1] = 0; No[2] =1; // d=((pdfPara[2*(No[1])]-pdfPara[2*(No[2])])*(pdfPara[2*(No[1])]-pdfPara[2*(No[2])])); // d+=((pdfPara[2*(No[1])+1]-pdfPara[2*(No[2])+1])*(pdfPara[2*(No[1])+1]-pdfPara[2*(No[2])+1])); // d = sqrt(d); // if(d =nRow) rr = nRow-1; // if(cc<0) cc =0; // if(cc>=nCol) cc = nCol-1; // *(pucStrLine+(nRange+r)*nTempW+m)=*(pucImg+rr*nCol+cc); // } // } // //// 找相关最大值 // for(r=0;r fabs(maxpp)) // { maxpp = pp; // maxPr = r; // } // } // //// 计算新模板(计算模板系数h0,h1) // ReturnH0H1(pucStrLine+maxPr*nTempW,pucStrLineTemp,nTempH*nTempW,pdfH0,pdfH1); // // ReGenerateTemp(pucStrLineTempNew,pucStrLineTemp,nTempH*nTempW,*pdfH0,*pdfH1); // // for(r=-3;r<=3;r++) // { for(m=0;m 10) ////如果改正数的最大值小于限差,迭代终止 // break; // dwTimes++; // } // ///// 结果输出 // for(i=0;i =nCol||(r0+r)<0||r0+r>=nRow) // *(pucI+r*DET_SCALE+c) = 0; // else // *(pucI+r*DET_SCALE+c) = *(pucImg+(r0+r)*nCol+c0+c); // } // } // ///// edge detection // EdgeDetByVision(pucI,DET_SCALE,DET_SCALE,0.1,30,30); // // HilditchThin2(pucI,DET_SCALE,DET_SCALE); // // SimpleThin2(pucI,DET_SCALE,DET_SCALE); // // ///// select the "best" output point // double v,d,mind=100000.0; // int er,ec,C=0; // for(r=0;r DET_SCALE ||mind > SNAP_RANGE) // { // er=ec= DET_SCALE/2; // } // ///// repostion the point(sub-pixel accuracy) // // ///// output point // pdfptOut[1].dfY = er+r0; // pdfptOut[1].dfX = ec+c0; // // delete pucI; // // return 1; //} double DisPtToLine(double dfX,double dfY, double dfPt1X,double dfPt1Y, double dfPt2X,double dfPt2Y) { float dmax; float a,b,c,D,d; float x1,x2,y1,y2,work; x1 = dfPt1X;x2 = dfPt2X;y1 = dfPt1Y;y2 = dfPt2Y; if(x1 == x2) { b = 0; a = 1; c = -x1; } else { b = -1.0; a = (y1 - y2) / (x1 - x2); c = y1 - a * x1; } work = (float)sqrt(a * a + b* b); d = (float)(abs(a * dfX + b * dfY + c) / work); return (double)d; } /* */ //double Coorelation(unsigned char *pucImgBlkData, // unsigned char *pucTemp1D, // unsigned long dwDataSize) //{ int i; // unsigned long sl,sr,sl2,sr2,slr; // double bb,p; // unsigned char *pucP,*pucPT; // // sl=sr=0L; // sl2=sr2=slr=0L; // pucP=pucImgBlkData; // pucPT = pucTemp1D; // for(i=0;i<(int)dwDataSize;i++) // { sl += *pucImgBlkData; // sl2 += (DWORD) *pucImgBlkData * *pucImgBlkData; // // if((*pucTemplateData)!=0) // { sr+=*pucTemp1D; // sr2+=(DWORD) *pucTemp1D* *pucTemp1D; // slr+=(DWORD) *pucTemp1D* *pucImgBlkData; // } // pucImgBlkData++; pucTemp1D++; // } // pucImgBlkData = pucP; // pucTemp1D=pucPT; // p=slr-(double)sl*sr/dwDataSize; // bb=(sl2-(double)sl*sl/dwDataSize)*(sr2-(double)sr*sr/dwDataSize); // if(bb<=0) // return 0; // bb=sqrt(bb); // p/=bb; // // return p; //} // //BOOL ReturnH0H1(unsigned char *pucImgBlkData, // unsigned char *pucTemp1D, // unsigned long dwDataSize, // double *pdfH0,double *pdfH1) //{ int i; // unsigned long sl,sr,sl2,sr2,slr; // double bb,p; // unsigned char *pucP,*pucPT; // // sl=sr=0L;/// l :image; r: template // sl2=sr2=slr=0L; // pucP=pucImgBlkData; // pucPT = pucTemp1D; // for(i=0;i<(int)dwDataSize;i++) // { sl += *pucImgBlkData; // sl2 += (DWORD) *pucImgBlkData * *pucImgBlkData; // // if((*pucTemplateData)!=0) // { sr+=*pucTemp1D; // sr2+=(DWORD) *pucTemp1D* *pucTemp1D; // slr+=(DWORD) *pucTemp1D* *pucImgBlkData; // } // pucImgBlkData++; pucTemp1D++; // } // *pdfH0 = ((double)slr*sr-sr2*sl)/((double)sr*sr-dwDataSize*sr2); // *pdfH1 = ((double)sl*sr-dwDataSize*slr)/((double)sr*sr-dwDataSize*sr2); // // return TRUE; //} // //double RetSigmaof2ImgBlk(unsigned char *pucImgBlkData, // unsigned char *pucTemp1D, // unsigned long dwDataSize) //{ int i; // unsigned long sl,sr,sl2,sr2,slr; // double bb,p; // unsigned char *pucP,*pucPT; // // sl=sr=0L;/// l :image; r: template // pucP=pucImgBlkData; // pucPT = pucTemp1D; // for(i=0;i<(int)dwDataSize;i++) // { sl = sl+((int)(*pucP) - (int)(*pucPT)) * ((int)(*pucP) - (int)(*pucPT)); // pucP++; pucPT++; // } // p = (double)sl; // p/=dwDataSize; // p = sqrt(p); // return p; //} // //BOOL ReGenerateTemp(unsigned char *pucNewTemp, // unsigned char *pucTemp1D, // unsigned long dwDataSize, // double dfH0,double dfH1) //{ int n; // // for(n=0;n dwImgCol) continue; // dwRowBia=(DWORD)wIy+wD1; // for(wD2=0;wD2 dwImgRow) continue; // wSum+= // *(pucImgData+dwRowBia*dwColLen+dwColBia+wD2); // } // } // *pucCmprs=(BYTE)(wSum/wAvSize); // pucCmprs++; // } // } // return (dwImgRow/wK)*(dwImgCol/wK); //} // // //BOOL RidgeDetBy1OrderZeroCrossing(unsigned char *pucImg,int nRow,int nCol,float fA, // float fK1,float fK2) //{ int t,r,c,rr,cc,i,nGx,nGy,n,I1,I2,J1,J2,nSumGray; // float fW,fWSum,fSum,fDir,fDirO,fDirD, // pfGrad[10],pfDir[10],pfDirD[10], // fG1,fG2,v,mv,G,pfGradTh[256]; // unsigned char *pucI,*pucI2,pucGradTh[256]; // // pucI = (unsigned char *)malloc(nRow*nCol*sizeof(unsigned char)); // pucI2 = (unsigned char *)malloc(nRow*nCol*sizeof(unsigned char)); // // if(!pucI||!pucI2) // return FALSE; // //// MedianFilter(pucImg,nRow,nCol,3); // // memcpy(pucI2,pucImg,nCol*nRow*sizeof(char)); // // for(i=0;i<256;i++) // {/* if(i==0) // { pucGradTh[i] = 100; // pfGradTh[i] = 100; // } // else // */ // { pucGradTh[i] =(unsigned char)(int) // (0.1*((exp(1.0/i)*fK1 + exp(1.0/(256-i))*fK2))); // } // } // // for(r=1;r fabs((double)nGy)?fabs((double)nGx):fabs((double)nGy); // // *(pucI+r*nCol+c) = (unsigned char)(int)G; // } // } // int V0,V1,V; // for(r=2;r 0 ) // { // ///输出边缘点 // if((*(pucI2+r*nCol+c)!=0) )//&& (pfGrad[4]<5)) // { // *(pucI2+r*nCol+c) = *(pucI+r*nCol+c); // *(pucI2+(r+I1)*nCol+c+J1) = *(pucI2+(r+I2)*nCol+c+J2)= 0; // } // else // *(pucI2+r*nCol+c) = 0; // } // else // *(pucI2+r*nCol+c) = 0; // } // } // for(r=0;r nRow?nCol:nRow; // pfSigLine = new float[LC]; // // //// Row Direction detction // for(r=nTemplateWid/2;r dfDist = sqrt((strLine->nptSt.dfX - strLine->nptEnd.dfX)* (strLine->nptSt.dfX - strLine->nptEnd.dfX) + (strLine->nptSt.dfY - strLine->nptEnd.dfY)* (strLine->nptSt.dfY - strLine->nptEnd.dfY)); strLine->fRo = DisPtToLine(0.0,0.0,strLine->nptSt.dfX,strLine->nptSt.dfY, strLine->nptEnd.dfX,strLine->nptEnd.dfY); //// Ro - Thta representation strLine->dfThta = fabs(strLine->nptSt.dfX - strLine->nptEnd.dfX) < 1.0? PI/2.0 : atan((strLine->nptSt.dfY - strLine->nptEnd.dfY)/(strLine->nptSt.dfX - strLine->nptEnd.dfX)); /// TRACE("thta = %f\n",(float)(strLine->dfThta)); strLine->dfThta = 180.0*(strLine->dfThta/PI); //// degree unit for angle !!!! } /* */ //int Semiauto_Corner_Fast_Hough(unsigned char *pucImg,int nRow,int nCol, // dfPOINT dfptInput,int dfDetRange, // CornerPt *pCornerPt,int nW) //{ // int i,j,X0,Y0,m,n,nCandC; // double x,y,gg,t1,t2,t3,dx,dy; // BYTE *pImgW; // dfPOINT *pptCands; // // X0 = (int)dfptInput.dfX-dfDetRange/2; // Y0 = (int)dfptInput.dfY-dfDetRange/2; //// X0=Y0=0; // pImgW = new BYTE[dfDetRange*dfDetRange]; // pptCands = new dfPOINT[dfDetRange*dfDetRange]; // // t1 = 30; /////// // t2 = 25; /////// 25 // t3 = 18.0; ///// 18 // // /////get search image window // for(i=0;i<(int)dfDetRange;i++) // for(j=0;j<(int)dfDetRange;j++) // { // if((int)(Y0+i)<0 ||(int)(Y0+i)>=nRow ||(int)(X0+j)<0 ||(int)(X0+j)>=nCol ) // *(pImgW + i*dfDetRange + j) = 128; // else // *(pImgW + i*dfDetRange + j) = *(pucImg+(int)(Y0+i)*nCol+(int)(X0+j)); // } // // SelfadpSmoothing2(pImgW,dfDetRange,dfDetRange,5,3); ///// 5,3 // // BYTE *pScore; // pScore = new BYTE[dfDetRange*dfDetRange]; // for(m=0;m 100) // t1 = 70; // else // t1 = 35; // if(gg < 30 ) //// t1 // continue; // // t2 = 50; // x = (double)(-nW/2+n); // y = (double)(-nW/2+m); // t = atan2(y,x); // t = 180.0*t/PI; // t = t<0 ? 360+t : t; // tt = t+90>=360?t+90-360:t+90; // tt = tt>=180?tt-180:tt; // gt = atan2(dy,dx); // gt = 180.0*gt/PI; // gt = gt<0?180+gt:gt; // gt = gt>=180?gt-180:gt; // if(fabs(tt-gt)>=t3) // continue; // // pfThta[(int)(0.5 + t/thtaIntv)] = pfThta[(int)(0.5 + t/thtaIntv)] + 1.0; // } // } // nC =0; // for(m=0;m =2) //// 2 // { // N[nC] = m; // nC++; // } // } // dt = (N[1]-N[0])*thtaIntv >=180.0 ? 360 - (N[1]-N[0])*thtaIntv : (N[1]-N[0])*thtaIntv; // if((nC==2 && dt<=120 && dt>=60)) // { // { // // score = 0.3 * (1.0 - t1/g0) + 0.3 * (pfThta[N[0]] + pfThta[N[1]])/(float)nW // + 0.4 * (1.0 - fabs(dt-90.0)/90.0); // score = score>=1.0?1.0:score; // // if(score*255.0 > 80 )//// && dg >0 // { // *(pScore + i*dfDetRange + j) = (BYTE)(int)(score*255.0 - 0.4 *dg); // pptCands[nCandC].dfX = (double)(j+X0)+0.5; // pptCands[nCandC].dfY = (double)(i+Y0)+0.5; // nCandC++; // } // } // } // } // } // delete pImgW; // delete pScore; // double dis,min_dis; // if(nCandC>0) // { // for(m=0;m 160&&rr!=0&&cc!=0) // // fW = 0.0; // fWSum+=fW; // fSum+=((int)(*(pucImg+(r+rr)*nCol+c+cc))*fW); // } // } // *(pucI+r*nCol+c) = (char)(int)(fSum/fWSum); // } // } // memcpy(pucImg,pucI,nCol*nRow*sizeof(char)); // } // // free(pucI); // return TRUE; //}