【OpenCV学习】Bresenham算法opencv实现

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

/*
 * =====================================================================================
 *
 *       Filename:  linebresenham.c
 *
 *    Description:  Bresenham for OpenCV
 *
 *        Version:  1.0
 *        Created:  01/07/2009 04:59:47 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Futuredaemon (BUPT), gnuhpc@gmail.com
 *        Company:  BUPT_UNITED
 *
 * =====================================================================================
 */
#include  <cv.h>
#include  <highgui.h>
#include  <cxcore.h>
#include  <iostream>
#include  <cmath>

using namespace std;

CvSize window = { 300, 300 };    //窗口大小

int main (int argc, char *argv[])
{
      IplImage *imgA = cvCreateImage (window, IPL_DEPTH_8U, 3);//建立图像
    cvSet (imgA, cvScalarAll (0), 0);//填充为0

    int xx1, yy1, xx2, yy2;//直线的两个端点
    int dx, dy, a, a1, e;//定义差量,误差等变量

  int x, y;
  /*设置直线的两个端点(20,20),(250,100) */
  xx1 = 20, yy1 = 20;
  xx2 = 250, yy2 = 100;
  /*计算横纵坐标差量 */
  dx = abs (xx2 - xx1);
  dy = abs (yy2 - yy1);
    /* 设定起始点 */    
  y = yy1;
  x = xx1;
  int sx, sy;//表明方向的变量

  if (xx1 > xx2)
    {
      sx = -1;//x递减方向
    }
  else
    {
      sx = 1;//x递增方向
    }



  if (yy1 > yy2)
    {
      sy = -1;//y递减方向
    }
  else
    {
      sy = 1;//y递增方向
    }


  if (dx >= dy)
    {
     e=0;
      for (x = xx1; (sx >= 0 ? x <= xx2 : x >= xx2); x += sx)
        {
          imgA->imageData[y * imgA->widthStep + x * 3] = (signed char) 255;
          imgA->imageData[y * imgA->widthStep + x * 3 + 1] = (signed char) 255;
          imgA->imageData[y * imgA->widthStep + x * 3 + 2] = (signed char) 255;
          e+=dy;
          if ((e<<1) >= dx)
            {
              y += sy;
              e -= dx;
            }
            
        }
    }
  else
  {
      e=0;
      for (y = yy1; (sy >= 0 ? y <= yy2 : y >= yy2); y += sy)
        {
          imgA->imageData[y * imgA->widthStep + x * 3] = (signed char) 255;
          imgA->imageData[y * imgA->widthStep + x * 3 + 1] = (signed char) 255;
          imgA->imageData[y * imgA->widthStep + x * 3 + 2] = (signed char) 255;
          e+=dx;
          if ((e<<1) >= dy)
            {
              x += sx;
              e -= dy;
            }
            
        }
  }
    

  cvNamedWindow ("window", CV_WINDOW_AUTOSIZE);
  cvShowImage ("window", imgA);

  cvWaitKey (0);

  cvReleaseImage (&imgA);
  cvDestroyWindow ("window");

  return 0;
}

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

原文地址:https://www.cnblogs.com/gnuhpc/p/2806665.html