下面的程序是我在视图类里面编写的画同心圆的程序,我期望能够达到这样一种效果:接下来能够用if语句判断每一组同心圆中各个圆周上象素值为0的点的个数,根据象素值为0的点的个数自动判断该圆心是节点还是边上的点。如果个数大于等于4则为节点,但是如果是边上的点个数定会有小于4个的情况存在。
现在的疑问就是:我这样画好同心圆直接加上if语句是不是就能够自动判别了呢?这样判别出是否节点之后,我怎么才能够知道节点的象素坐标值呢?用文本输出的方式吗?如果就让他在后台运行不要让他输出呢?
这个地方我非常困惑。另外,图像已经进行了轮廓跟踪,并将轮廓上点的象素坐标都已经保存在二维数组里面了,现在就是希望能够判别出轮廓上哪些是节点,以便利用节点的象素坐标和真实坐标找出二者之间的对应关系。谢谢大家了!
BOOL CMy2DREView::Ellipse(int x1, int y1, int x2, int y2)
{
int i;
int j;
EdgePoint m_EdgePoint;
int nNumNode;
int nCurX,nCurY,nNextX,nNextY,nFirstX,nFirstY;
nNumNode=TraceArray.GetSize();
if(nNumNode<1)
{
AfxMessageBox("是否没有进行轮廓跟踪?\n请进行正确的轮廓跟踪!");
return FALSE;
} //获取第0个节点的数据
m_EdgePoint=TraceArray.GetAt(0);
nCurX=m_EdgePoint.CurPoint.x;
nCurY=m_EdgePoint.CurPoint.y;
nFirstX=nCurX;
nFirstY=nCurY;
CClientDC dc(this);
//以第0个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nFirstX-j,nFirstY+j,nFirstX+j,nFirstY-j);
}
//dc.Ellipse(nFirstX-1,nFirstY+1,nFirstX+1,nFirstY-1);
for(i=1;i<nNumNode;i++)
{
//获取第i个节点的数据
m_EdgePoint=TraceArray.GetAt(i);
nNextX=m_EdgePoint.CurPoint.x;
nNextY=m_EdgePoint.CurPoint.y;
//以第i个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nNextX-j,nNextY+j,nNextX+j,nNextY-j);
}
}
return TRUE;
}
现在的疑问就是:我这样画好同心圆直接加上if语句是不是就能够自动判别了呢?这样判别出是否节点之后,我怎么才能够知道节点的象素坐标值呢?用文本输出的方式吗?如果就让他在后台运行不要让他输出呢?
这个地方我非常困惑。另外,图像已经进行了轮廓跟踪,并将轮廓上点的象素坐标都已经保存在二维数组里面了,现在就是希望能够判别出轮廓上哪些是节点,以便利用节点的象素坐标和真实坐标找出二者之间的对应关系。谢谢大家了!
BOOL CMy2DREView::Ellipse(int x1, int y1, int x2, int y2)
{
int i;
int j;
EdgePoint m_EdgePoint;
int nNumNode;
int nCurX,nCurY,nNextX,nNextY,nFirstX,nFirstY;
nNumNode=TraceArray.GetSize();
if(nNumNode<1)
{
AfxMessageBox("是否没有进行轮廓跟踪?\n请进行正确的轮廓跟踪!");
return FALSE;
} //获取第0个节点的数据
m_EdgePoint=TraceArray.GetAt(0);
nCurX=m_EdgePoint.CurPoint.x;
nCurY=m_EdgePoint.CurPoint.y;
nFirstX=nCurX;
nFirstY=nCurY;
CClientDC dc(this);
//以第0个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nFirstX-j,nFirstY+j,nFirstX+j,nFirstY-j);
}
//dc.Ellipse(nFirstX-1,nFirstY+1,nFirstX+1,nFirstY-1);
for(i=1;i<nNumNode;i++)
{
//获取第i个节点的数据
m_EdgePoint=TraceArray.GetAt(i);
nNextX=m_EdgePoint.CurPoint.x;
nNextY=m_EdgePoint.CurPoint.y;
//以第i个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nNextX-j,nNextY+j,nNextX+j,nNextY-j);
}
}
return TRUE;
}
解决方案 »
- 为何用GetParent()无法获取父窗口指针
- 求教:控件保存为图片
- nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex怎么解决阿
- 进来帮我看看吧,MDI问题
- 用VC做数据处理系统好吗
- 希望热心人士提供一个可以下载installshield professional 6.22或更高版本的下载网址?
- web
- 我想建一个类,关于OPC客户端的,但不知这个类属于那个类,基类选那个
- 如何消除透明位图产生的锯齿??
- 怎样知道一个文件夹下的所有文件
- 怎样判断一个新打开的ie窗口是通过在别的ie窗口上用ctrl+n打开的?
- 对话框最小化,最大画后,我用button触发的图被擦掉了,但因为一些关系,draw()函数不能放在onpaint中
1、可以先找出每个同心圆的行列像素范围(X,Y坐标范围);
2、当列像素从小到大循环时(循环间距一个像素),计算它的行像素,用如下公式计算:
(x-x0)^2+(y-y0)^2 = r^2;
3、圆周上所有点的像素都计算出来了,应该知道怎么判断了吧。
-----------------------------------
这句话的说法不够准确,用公式求出的不是像素值,而是该像素的行号或列号(坐标),然后根据该像素的行列号,从内存块中取出它的像素值。然后再按你后面说的作。
lpSrc = (char *)lpDIBBits + lLineBytes * ( CurPoint.y + Direction[BeginDirect][1])
+ (CurPoint.x+ Direction[BeginDirect][0]);
pixel = (unsigned char)*lpSrc;//这个地方的象素就是像你说的那样取出来的,是吗?
if(pixel == 0)
{
bFindPoint = true;
//结构数组中记录的第一个点是最左下边界点,即起始点
//方向为到下一点的矢量方向
m_EdgePoint.CurPoint.x = CurPoint.x;
m_EdgePoint.CurPoint.y = CurPoint.y;
m_EdgePoint.nCurVerct = (BYTE)BeginDirect;
TraceArray.Add(m_EdgePoint);//你看我把边界点的坐标值都存到一个数组里面了,我的同心圆的圆心坐标就是从这个数组里面取出来的,在圆周上必定有四个点关于圆心在x或y方向对称,也就是说在x或y方向分别有两个点的x或y坐标跟圆心是一样的,这样我就可以知道他们的y或x坐标了。然后根据lpSrc = (char *)lpDIBBits + lLineBytes * ( CurPoint.y + Direction[BeginDirect][1])
+ (CurPoint.x+ Direction[BeginDirect][0]);
pixel = (unsigned char)*lpSrc;来得到象素值,再去判断他是否为0。
是吗?谢谢