计算一条曲线中的多条直线段,该如果做???

freespider 2003-10-14 11:57:11
有一些离散点,由这些离散点构成了一条曲线,曲线中的大致分为几段,每段都近似于一条直线。我需要根据这些离散点(已经存在数组中了),求出:曲线中分为几段,每段的交界点的位置。
请问该怎样求,提供点思路都行。
...全文
53 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zzwu 2003-10-14
可以用Hough变换来提取各组成线段.
你不需要考察整幅图像,而只要考察组成曲线的那些点就行了,所以速度应是很快的.
  • 打赏
  • 举报
回复
freespider 2003-10-14
对,是有序的
  • 打赏
  • 举报
回复
HUNTON 2003-10-14
这些离散点是不是从曲线的一头到另一头地放在数组中,也就是说这些点是不是有序的啊?
  • 打赏
  • 举报
回复
zzwu 2003-10-14
要利用2点就来计算斜率恐怕不行.只要不是完全垂直或完全水平的直线,它们的相邻像素的斜率往往变化很大,1,2两点可以是左右走,2,3两就可能立刻变成上下走了,如看成直线,那就是有90度的变化了.
  • 打赏
  • 举报
回复
HUNTON 2003-10-14
把每相邻两点的斜率都算算,如果连续几个斜率都没什么变化,那么这几个斜率对应的点就是在一条直线上了。变化较大的,斜率相应线段的起点就是折线端点。
  • 打赏
  • 举报
回复
zzwu 2003-10-14
Hough变换得到的是一些直线,起点和终点都要利用直线求交来得到.
  • 打赏
  • 举报
回复
zzwu 2003-10-14
Hough变换可以参看下面的程序(要对其中的循环作修改):

BOOL Hough(HWND hWnd)
{
typedef struct{
int topx;
int topy;
int botx;
int boty;
}MYLINE;

DWORD BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR lpPtr;
HDC hDc;
LONG x,y;
long i,maxd;
int k;
int Dist,Alpha;
HGLOBAL hDistAlpha,hMyLine;
int *lpDistAlpha;
MYLINE *lpMyLine,*TempLine,MaxdLine;
static LOGPEN rlp={PS_SOLID,1,1,RGB(255,0,0)};
HPEN rhp;

if( NumColors!=256){
MessageBox(hWnd,"Must be a mono bitmap with grayscale palette!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
Dist=(int)(sqrt( (double)bi.biWidth*bi.biWidth+(double)bi.biHeight*bi.biHeight)+0.5);
Alpha=180 /2 ; //0 degree to 178 degree , step is 2 degrees

if((hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist* Alpha * sizeof(int)))==NULL){
MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}

if((hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(MYLINE)))==NULL){
GlobalFree(hDistAlpha);
return FALSE;
}

BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
lpDistAlpha=(int *)GlobalLock(hDistAlpha);
lpMyLine=(MYLINE *)GlobalLock(hMyLine);

for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
(*TempLine).boty=32767;
}

for (y=0;y<bi.biHeight;y++){
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for (x=0;x<bi.biWidth;x++)
if(*(lpPtr++)==0)
for (k=0;k<180;k+=2){
i=(long)fabs((x*cos(k*PI/180.0)+y*sin(k*PI/180.0)));
*(lpDistAlpha+i*Alpha+k/2)=*(lpDistAlpha+i*Alpha+k/2)+1;
TempLine=(MYLINE*)(lpMyLine+i*Alpha+k/2);
if(y> (*TempLine).topy){
(*TempLine).topx=x;
(*TempLine).topy=y;
}
if(y< (*TempLine).boty){
(*TempLine).botx=x;
(*TempLine).boty=y;
}
}
}

maxd=0;
for (i=0;i<(long)Dist*Alpha;i++){
TempLine=(MYLINE*)(lpMyLine+i);
k=*(lpDistAlpha+i);
if( k > maxd){
maxd=k;
MaxdLine.topx=(*TempLine).topx;
MaxdLine.topy=(*TempLine).topy;
MaxdLine.botx=(*TempLine).botx;
MaxdLine.boty=(*TempLine).boty;
}
}

hDc = GetDC(hWnd);
rhp = CreatePenIndirect(&rlp);
SelectObject(hDc,rhp);
MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL);
LineTo(hDc,MaxdLine.topx,MaxdLine.topy);
DeleteObject(rhp);
ReleaseDC(hWnd,hDc);

GlobalUnlock(hImgData);
GlobalUnlock(hDistAlpha);
GlobalFree(hDistAlpha);
GlobalUnlock(hMyLine);
GlobalFree(hMyLine);
return TRUE;
}
  • 打赏
  • 举报
回复
freespider 2003-10-14
但是我不知道分为几段啊,还有各段的起始和结束,我都不知道,我希望求出的就是这个。
  • 打赏
  • 举报
回复
相关推荐
发帖
机器视觉
加入

4279

社区成员

图形图像/机器视觉
社区管理员
  • 机器视觉
申请成为版主
帖子事件
创建了帖子
2003-10-14 11:57
社区公告
暂无公告