社区
机器视觉
帖子详情
计算一条曲线中的多条直线段,该如果做???
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
但是我不知道分为几段啊,还有各段的起始和结束,我都不知道,我希望求出的就是这个。
打赏
举报
回复
赞
相关推荐
CAD
中
如何快速等分
一条
直线
或
曲线
?教程详解
一般图纸设计
中
的时候,在CAD
中
有时我们想得到
直线
或
曲线
的等分点,有时我们想沿
直线
或
曲线
等距或等分排列图形,这个时候
该
怎么办呢?但其实在CAD很早的版本就提供了定数等分和定距等分的功能,可能只是大家没有发现...
html
直线
变
曲线
,CSS3怎么画
曲线
?
CSS3怎么画
曲线
?下面本篇文章给大家介绍一下CSS3画
曲线
的方法。...因此,就想着可以利用border的特性画
一条
曲线
。1、首先我们先建一个div元素2、给它一些基本样式.container {width: 500px;height: 200px;border...
python
多条
曲线
拟合成
一条
,python多折线拟合实现
请教一个多组数据点拟合的问题,需要用 Python 实现试试 numpy.piecewise() 或者 google 一下 piecewise liearn fitting 对 numpy 不熟悉,以我朴素的数学知识瞎 bibi 下, 先锁定第一点 A 和最后一点 B, 然后假定...
python求点到
曲线
距离_求一个点到
曲线
或折线的最短距离?
只回答定点到折线的最短距离的求法。... 算一
段
直线
离定点最近的点的方法是:由定点向
直线
段
所在的
直线
引垂线,如果垂足在那一
段
直线
内,则垂足即为离定点最近的点,如垂足在
直线
段
的外边,则直...
python
中
用plot绘制两条
直线
_用Matplotlib在两个y轴上绘制
多条
直线
尖叫着: 添加: 可以为绘图的每一侧设置不同的比例:fig, ax = plt.subplots() plt.plot(df['a'], ' r', label='Line a') plt.plot(df['b'], ' k', label='Line b') plt.legend() ax.tick_params('vals', colors='r...
发帖
机器视觉
加入
微信扫一扫
点击复制链接
分享社区
下载分享明细
4279
社区成员
1.5w+
社区内容
图形图像/机器视觉
社区管理员
申请成为版主
帖子事件
创建了帖子
2003-10-14 11:57
社区公告
暂无公告