//灰度域变化 threshold(gray,gray,0,255,THRESH_BINARY_INV); GaussianBlur(gray,gray,Size(3,3),0,0); //寻找和绘制轮廓 VP bigestContour = FindBigestContour(gray); contours.push_back(bigestContour);
vector<vector<point>>
int itopleft =65535; int idownright =0; Point ptopleft; Point pdownright; Point pdownleft; for(int i=0;i<bigestContour.size();i++){ //左上 if(bigestContour[i].x + bigestContour[i].y <itopleft){ itopleft = bigestContour[i].x + bigestContour[i].y ; ptopleft = bigestContour[i]; } //右下 if(bigestContour[i].x+bigestContour[i].y>idownright){ idownright = bigestContour[i].x+bigestContour[i].y; pdownright = bigestContour[i]; } } int idownleft =65534; //对于左下的点来说,应该是所有y大于左上的点中,x最小的 for(int i=0;i<bigestContour.size();i++){ if(bigestContour[i].y>ptopleft.y){ if(bigestContour[i].x<idownleft){ idownleft = bigestContour[i].x; pdownleft = bigestContour[i]; } } } //绘制 circle(board,ptopleft,10,Scalar(255),5); circle(board,pdownright,10,Scalar(255),5); circle(board,pdownleft,10,Scalar(255),5);
///在board上寻找角点 ///// Detector parameters int blockSize = 2; int apertureSize = 3; double k = 0.04; int thresh = 1; /// Detecting corners board.convertTo(board,CV_32F); cornerHarris( board,dst,2,3,0.04); ///// Normalizing normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() ); convertScaleAbs( dst_norm, dst_norm_scaled ); ///// Drawing a circle around corners for( int j = 0; j < dst_norm.rows ; j++ ) { for( int i = 0; i < dst_norm.cols; i++ ) { if( (int) dst_norm.at<float>(j,i) > thresh ) { circle( dst_norm_scaled, Point( i, j ), 5, Scalar(0), 2, 8, 0 ); circle(src,Point( i, j ), 5, Scalar(255,0,0), -1, 8, 0 ); }
}
}
//遍历轮廓,求出所有支撑角度 int icount = bigestContour.size(); float fmax = -1;//用于保存局部最大值 int imax = -1; bool bstart = false; for (int i=0;i<bigestContour.size();i++){ Point2f pa = (Point2f)bigestContour[(i+icount-7)%icount]; Point2f pb = (Point2f)bigestContour[(i+icount+7)%icount]; Point2f pc = (Point2f)bigestContour[i]; //两支撑点距离 float fa = getDistance(pa,pb); float fb = getDistance(pa,pc)+getDistance(pb,pc); float fang = fa/fb; float fsharp = 1-fang; if (fsharp>0.05){ bstart = true; if (fsharp>fmax){ fmax = fsharp; imax = i; } }else{ if (bstart){ circle(board,bigestContour[imax],10,Scalar(255),1); circle(src,bigestContour[imax],10,Scalar(255,255,255),1); imax = -1; fmax = -1; bstart = false; } } }
原文:http://www.cnblogs.com/jsxyhelu/p/5106760.html