特征检测算法的实现
Implementation of feature detection algorithm
我是编程新手,想知道如何开始用 C++ 实现以下算法,
给定一个二值图像,其中强度为 255 的像素显示 边缘 ,强度为 0 的像素显示 背景 ,找到长于n
图像中的像素。 t
是一个计数器,显示没有找到一行的迭代次数,tm
是退出程序前允许的最大迭代次数。
- 让
t=0
.
- 从图像中随机取两个边缘点,求直线通过方程
通过他们。
- 求
m
,图像中距离d像素以内的其他边缘点的个数
这条线。
如果m > n
,转到步骤5。
否则 (m ≤ n
),将 t
递增 1,如果 t < tm
转到步骤 2,并且
if t ≥ tm
退出程序。
- 绘制直线并移除落在距离
d
像素距离内的边缘点
图片。然后,转到步骤 1
基本上,我只是想从图像中随机选择两个点,找出它们之间的距离,如果那个距离太小,我会检测它们之间的一条线。
如果能提供一小段代码让我入门,我将不胜感激。
这更像是 RANSAC 参数线检测。如果我完成它,我也会保持这个 post 更新。
/* 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();
}
让我们假设您有 int[XDIMENSION][YDIMENSION]
Let t=0.
int t = 0; // ;-)
Take two edge points randomly from the image and find equation of the line passing through them.
蛮力:可以随机搜索图像中的点,当不是边缘点时重新搜索
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) );
Find m
, the number of other edge points in the image that are within distance d
pixels of the line.
你需要点之间的线。一些搜索产生 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;
}
你在这里看到规律了吗?将步骤分成子步骤,询问 google,查看 the documentation,尝试一些东西直到它起作用。
您的下一步可能是
- 创建一个distance function,euclidean 应该足够了
- 根据距离函数找到线旁边(或点旁边,这更容易)的所有点
尝试一些,如果您仍然需要帮助,请回来。
我是编程新手,想知道如何开始用 C++ 实现以下算法,
给定一个二值图像,其中强度为 255 的像素显示 边缘 ,强度为 0 的像素显示 背景 ,找到长于n
图像中的像素。 t
是一个计数器,显示没有找到一行的迭代次数,tm
是退出程序前允许的最大迭代次数。
- 让
t=0
. - 从图像中随机取两个边缘点,求直线通过方程 通过他们。
- 求
m
,图像中距离d像素以内的其他边缘点的个数 这条线。 如果
m > n
,转到步骤5。否则 (
m ≤ n
),将t
递增 1,如果t < tm
转到步骤 2,并且 ift ≥ tm
退出程序。- 绘制直线并移除落在距离
d
像素距离内的边缘点 图片。然后,转到步骤 1
基本上,我只是想从图像中随机选择两个点,找出它们之间的距离,如果那个距离太小,我会检测它们之间的一条线。
如果能提供一小段代码让我入门,我将不胜感激。 这更像是 RANSAC 参数线检测。如果我完成它,我也会保持这个 post 更新。
/* 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();
}
让我们假设您有 int[XDIMENSION][YDIMENSION]
Let t=0.
int t = 0; // ;-)
Take two edge points randomly from the image and find equation of the line passing through them.
蛮力:可以随机搜索图像中的点,当不是边缘点时重新搜索
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) );
Find
m
, the number of other edge points in the image that are within distanced
pixels of the line.
你需要点之间的线。一些搜索产生 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;
}
你在这里看到规律了吗?将步骤分成子步骤,询问 google,查看 the documentation,尝试一些东西直到它起作用。
您的下一步可能是
- 创建一个distance function,euclidean 应该足够了
- 根据距离函数找到线旁边(或点旁边,这更容易)的所有点
尝试一些,如果您仍然需要帮助,请回来。