【发布时间】:2016-01-11 15:21:13
【问题描述】:
我是编程新手,想知道如何开始在 C++ 中实现以下算法,
给定一个二值图像,其中强度为 255 的像素显示边缘,强度为 0 的像素显示背景,在图像中找到比n 像素长的线段。 t 是一个计数器,显示没有找到一行的迭代次数,tm 是退出程序前允许的最大迭代次数。
- 让
t=0. - 从图像中随机取两个边缘点,求直线通过方程 通过他们。
- 找到
m,图像中距离为d像素的其他边缘点的数量 线。 -
如果
m > n,请转到步骤5。否则 (
m ≤ n),将t增加 1,如果t < tm转到步骤 2,并且 ift ≥ tm退出程序。 - 画线并删除距离它的
d像素距离内的边缘点 图片。然后,转到第 1 步
基本上,我只是想从图像中随机选择两个点,找到它们之间的距离,如果距离太小,我会检测它们之间的一条线。
如果提供一个小代码 sn-p 来帮助我入门,我将不胜感激。 这更像是 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();
}
【问题讨论】:
-
检查 OpenCV 示例和函数。 HoughLines function 可能是您可以使用的东西。 OpenCV 还提供了检测边缘、features 和其他东西的功能。
-
我知道 houghlines,并且 houghlinesP 检测线,但我想尝试实现上述算法。
标签: c++ algorithm line implementation ransac