采用链码表计算轮廓的长度,链码值为奇数时,长度为sqrt(2),否则,长度为1。统计奇数链码值数量,非奇数链码值数目为链码长度减去奇数链码值数量。 采用线段表计算轮廓的面积,只需要将所有线段长度求和即可。
#include <math.h> #include <vector> typedef std::vector<int> ivChainCode; typedef std::vector<POINT> ptLineTable; // 轮廓长度 // 1. ChainCode 链码表 double ContourLength(ivChainCode ChainCode) { double dLength = 0; int nOddCode = 0; ivChainCode::iterator i; for (ivChainCode::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(ptLineTable LineTable) { long lArea = 0; ptLineTable::iterator i; for (i = LineTable.begin(); i != LineTable.end(); i += 2) { lArea += ((i + 1)->x - i->x + 1); } return lArea; }