织梦CMS - 轻松建站从此开始!

罗索

从轮廓中取得四肢与头部的算法

落鹤生 发布于 2010-04-13 22:26 点击:次 
从轮廓中取得四肢与头部的算法 实现了取得四肢与头部的算法,即取得五个U形的端点.
TAG:

从轮廓中取得四肢与头部的算法

实现了取得四肢与头部的算法,即取得五个U形的端点.


算法如下:

  1. int SegmentBody(CvSeq* contour) 
  2.  float StandBodyLength = 10.0; 
  3.  float StandArc = 40; 
  4.  float lk,l1,l2=0; 
  5.  CvPoint pt1,pt2,pt0; 
  6.  double total_arc = 0; //内旋角度 
  7.  double rarc12= 0; 
  8.  double arc12= 0; 
  9.   
  10.  bool Haslkvec = false//是否存在先前记录的矢量 
  11.  
  12.  CvSeqReader reader; 
  13.  CvSeqReader subReader; 
  14.  int N = contour->total; 
  15.  int i; 
  16.  CvPoint pt; 
  17.  CvPoint pre_pt; 
  18.  CvPoint pre_pre_pt; 
  19.  
  20.  //CvFont font; 
  21.  //cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.3, 0.3, 0.0, 1, CV_AA ); 
  22.  
  23.  
  24.  cvStartReadSeq(contour, &reader); 
  25.  
  26.  for (i= 0; i < N; i++) 
  27.  { 
  28.   CV_READ_SEQ_ELEM(pt, reader); 
  29.   //printf("%d,%d \n",pt.x,pt.y); 
  30.   pre_pt = pre_pre_pt = pt; 
  31.    
  32.    
  33.   //draw_cross( pt, CV_RGB(255,255,255), 3 ); 
  34.  
  35.   if(i==9) 
  36.    draw_cross( pt, CV_RGB(240,222,240), 3 ); 
  37.       
  38.   //cvLine( dst, pt,pre_pt,CV_RGB(0,255,0),2,CV_AA, 0 ); 
  39.   //计算两点之间的距离 
  40.   subReader = reader ; 
  41.  
  42.   Haslkvec = false
  43.   total_arc =0; 
  44.  
  45.   //printf("------------------ \n"); 
  46.   //printf("%d,%d \n",pt.x,pt.y); 
  47.   for(int j=0;j<5;j++) 
  48.   {   
  49.    //printf("in sub %d,%d \n",pt.x,pt.y); 
  50.    l1=calc_2Point_Magnitude(pt,pre_pt); 
  51.    if (l1>StandBodyLength) 
  52.    { 
  53.     //是否存在先前记录的点,如果有,检查角度范围 
  54.     if(Haslkvec) 
  55.     {      
  56.      Vector3f vt1 =  Vector3f (pre_pre_pt.x-pre_pt.x,pre_pre_pt.y-pre_pt.y,0); 
  57.      Vector3f vt2 =  Vector3f (pre_pt.x-pt.x,pre_pt.y-pt.y,0); 
  58.      arc12 = AngleBetweenVectors(vt1,vt2); 
  59.      rarc12 = 180*arc12/pi; 
  60.      Vector3f vtnor=Cross(vt1,vt2); //使用叉集检查矢量是内旋还是外旋。 
  61.      if(vtnor.z >0) total_arc += rarc12; 
  62.      else total_arc -= rarc12; 
  63.       
  64.      // 检查角度范围合理 -200 -160 
  65.      if (abs(total_arc+180)<StandArc)  
  66.      {       
  67.       // 检查平行线之间构成四边形是否在同一轴线上,相似度判断 
  68.       if(Is_Closed_Vectors(pt,pre_pt,pt1,pt2)) 
  69.       { 
  70.        // 匹配成功,完成一个搜索     
  71.        //记录两个矢量,清空标记     
  72.        Haslkvec = false
  73.        total_arc = 0;  
  74.        //绘出位置 
  75.        draw_2Points(pt,pre_pt,pt1,pt2); 
  76.        // 跳过已经成形的点,好处是减少计算,二是避免歧异点 
  77.        for(int k=0;k<j;k++) 
  78.        { 
  79.         CV_READ_SEQ_ELEM(pt, reader); 
  80.         pre_pt = pre_pre_pt = pt; 
  81.        } 
  82.       } 
  83.       //cvShowImage( "Components", dst ); 
  84.       //cvWaitKey(0); 
  85.       break
  86.      } 
  87.  
  88.     } 
  89.     else 
  90.     { 
  91.      // 记录两个点 
  92.      pt1=pt; 
  93.      pt2=pre_pt; 
  94.      Haslkvec = true
  95.     } 
  96.      
  97.    } 
  98.    // 对于短线段忽略,并且跳过其检测点,将加快检测速度。 
  99.    else 
  100.    { 
  101.     pt = pre_pt; 
  102.     pre_pt = pre_pre_pt;         
  103.    } 
  104.  
  105.    pre_pre_pt = pre_pt; 
  106.    pre_pt= pt; 
  107.    CV_READ_SEQ_ELEM(pt, subReader); 
  108.   } 
  109.  } 
  110.  
  111.  return 0; 

 

(hardVB)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9105.html]
本文出处:CSDN博客 作者:hardVB
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容