opencv使用概率霍夫变换得到直线后,获取该直线上的点信息(位置,数量)

14 篇文章 0 订阅

看了几篇博客,用的都是DDA算法,但是结果都不对,因为如果去最大步长的话,那么较小步长就小于1,直接导致加到x,y之后会被自动约掉小数(因为x,y为整数类型),因此对DDA算法做了以下改进。

参考文章:https://www.cnblogs.com/fx-blog/p/9055101.html

      
//获取x、y方向的变化最小的方向
   int minstep; 
      if(abs(delta_x)>abs(delta_y)){
          minstep = abs(delta_y);
      }
      else{
	  minstep = abs(delta_x);	
      }

//获取变化较小的方向的1个步长和变化较大方向的对应的步长单位
      double xUnitstep = abs(delta_x) /minstep;
      double yUnitstep = abs(delta_y) /minstep;


      cout<< "xUnitstep: " << xUnitstep<<endl;
      cout<< "yUnitstep: " << yUnitstep<<endl;


//plines[0]、plines[1]是直线的开始端点的坐标
      int x = plines[0];
      int y = plines[1];

 //遍历最小变化的方向,较大变化方向的变化上边代码已经算出,x,y分别加上他们的变化(注意理解j*)
      for(int j=0; j<minstep; ++j){
          x = x + j * xUnitstep;
          y = y + j * yUnitstep;
       
          //对直线上的点x,y做输出或者其他操作
          cout<< pic.at<uchar>(y,x) <<endl;

      //操作完之后x,y要相应减去变化,变回到直线的开始端点坐标
          //(注意理解int的使用,上边的x,y加上j*xUnitstep, j*yUnitstep之后,
          //会自动变成整数类型,因为x,y位整型,xUnitstep,yUnitstep为double型)
          x = x - int(j * xUnitstep);
          y = y - int(j * yUnitstep);
      }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值