特征检测算法的实现

时间:2015-10-13 18:30:37

标签: c++ algorithm line implementation ransac

我对编程很新,想知道如何在C ++中开始实现以下算法,

给定二进制图像,其中强度为255的像素显示,强度为0的像素显示背景,找到长于n像素的线段图片。 t是一个计数器,显示没有找到一行的迭代次数,tm是退出程序前允许的最大迭代次数。

  1. 允许t=0
  2. 从图像中随机取两个边缘点,找到直线的方程 透过他们。
  3. 查找m,图像中距离d像素范围内的其他边缘点数 这条线。
  4. 如果m > n,请转到步骤5.

    否则(m ≤ n),将t递增1,如果t < tm转到步骤2, if t ≥ tm退出计划。

  5. 绘制直线并从距离中移除距离d像素距离的边缘点 图片。然后,转到步骤1
  6. 基本上,我只是想从图像中随机选取两个点,找到它们之间的距离,如果距离太小,我会检测它们之间的一条线。

    如果提供了一个小代码片段,我会很感激,让我开始。 这更像是RANSAC参数线检测。如果我完成它,我还会更新这篇文章。

    /* Display Routine */
    
    #include "define.h"
    
    ByteImage bimg;                     //A copy of the image to be viewed
    int width, height;                  //Window dimensions
    GLfloat zoomx = 1.0, zoomy = 1.0;   //Pixel zoom
    int win;                            //Window index
    
    void resetViewer();
    
    void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    if ((w!=width) || (h!=height)) {
        zoomx=(GLfloat)w/(GLfloat)bimg.nc;
        zoomy=(GLfloat)h/(GLfloat)bimg.nr;
        glPixelZoom(zoomx,zoomy);
    }
    width=w; height=h;
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    
    void mouse(int button, int state, int x, int y) {
    glutPostRedisplay();
    if((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN) &&
        (zoomx==1.0) && (zoomy==1.0)){
    printf(" row=%d, col=%d, int=%d.\n", y,x, (int)bimg.image[(bimg.nr-1-y)*bimg.nc+x]);
            glutPostRedisplay();
    }
    }
    
    void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glRasterPos2i(0, 0);         
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    
    glDrawPixels((GLsizei)bimg.nc,(GLsizei)bimg.nr,   GL_LUMINANCE,GL_UNSIGNED_BYTE, bimg.image);
    glutSwapBuffers();
    }
    

1 个答案:

答案 0 :(得分:1)

我们假设你有int[XDIMENSION][YDIMENSION]

  

设t = 0。

int t = 0; // ;-)
  

从图像中随机取两个边缘点,找到通过它们的线的方程式。

蛮力:你可以随机搜索图像中的点,并在它们不是边缘点时重新搜索

struct Point {
  int x;
  int y;
};

bool is_edge(Point a) {
  return image[a.x][a.y] == 255;
}

int randomUpto(int upto) {
  int r = rand() % upto;
  return r;
}

,需要通过

初始化伪随机数发生器
srand(time(NULL));

寻找边缘点

  Point a;
  do {
    a.x = randomUpto(XDIMENSION);
    a.y = randomUpto(YDIMENSION);
  } while ( ! is_edge(a) );
  

查找m,即图片中距离线d像素距离内的其他边缘点的数量。

你需要点之间的界限。一些搜索产生this fine answer,这导致

std::vector<Point> getLineBetween(Point a, Point b) {
  double dx = b.x - a.x;
  double dy = b.y - a.y;
  double dist = sqrt(dx * dx + dy * dy);
  dx /= dist;
  dy /= dist;
  std::vector<Point> points;
  points.push_back(a);
  for ( int i = 0 ; i < 2*dist; i++ ) {
    Point tmp;
    tmp.x = a.x + (int)(i * dx /2.0);
    tmp.y = a.y + (int)(i * dy /2.0);
    if ( tmp.x != points.back().x
     || tmp.y != points.back().y ) {
      points.push_back(tmp);
    }
  }
  return points;
}

你在这看到一个模式吗?将步骤隔离为子步骤,询问谷歌,查看the documentation,尝试一下这些东西直到它工作。

接下来的步骤可能是

  • 创建一个distance function,euclidean就足够了
  • 根据距离函数
  • 查找线旁边的所有点(或点旁边的点,这更容易)

尝试一些,如果仍需要帮助,请回来。