采用链码表计算轮廓的长度,链码值为奇数时,长度为sqrt(2),否则,长度为1。统计奇数链码值数量,非奇数链码值数目为链码长度减去奇数链码值数量。
采用线段表计算轮廓的面积,只需要将所有线段长度求和即可。
#include <math.h>
#include <vector>
typedef std::vector<int> ivecChainCode;
typedef std::vector<POINT> ptvecLineTable;
// 轮廓长度
// 1. ChainCode 链码表
double ContourLength(ivecChainCode ChainCode)
{
double dLength = 0;
int nOddCode = 0;
for (ivecChainCode::iterator i = ChainCode.begin(); i != ChainCode.end(); i++)
{
if (*i & 0x01) nOddCode++;
}
dLength = ChainCode.size() - nOddCode + nOddCode * sqrt(2.0);
return dLength;
}
// 轮廓面积
// 1. LineTable 线段表
long ContourArea(ptvecLineTable LineTable)
{
long lArea = 0;
for (ptvecLineTable::iterator i = LineTable.begin(); i != LineTable.end(); i += 2)
{
lArea += ((i + 1)->x - i->x + 1);
}
return lArea;
}
文章评论(0条评论)
登录后参与讨论