如何计算非常小的物体的面积,有时是2像素的面积? MATLAB的regionprops()似乎做得很好,并且会为一个点返回偶数值1。我已经在这个问题上广泛阅读,每个人似乎都在警告自相交的轮廓,但却没有其他选择。以下是我的代码示例:
void cMcDetect::shapeFeats(vector<Point> contours, const cv::Mat &img)
{
// % Area, Compactness, Orientation, Eccentricity, Solidity
double A, C, O=NAN, E, S;
vector<Point> ch; convexHull(contours, ch);
Moments mu = moments(contours,0);
double CHA = contourArea(ch);
A=contourArea(contours); // Object Area
S = A/CHA; // Solidity
E = (mu.m20+mu.m02 + sqrt( pow(mu.m20-mu.m02,2)+4*pow(mu.m11,2) ))/ // Eccentricity
(mu.m20+mu.m02 - sqrt( pow(mu.m20-mu.m02,2)+4*pow(mu.m11,2) ));
Rect boundrect = boundingRect(contours); // Compactness
C = A/(boundrect.width*boundrect.height);
if(contours.size()>=5){
RotatedRect rotrect = fitEllipse(contours); // Orientation
O = rotrect.angle;
}
printf("%f %f %f %f %f\n",A, C, O, E, S);
}
对于对象区域,我得到非常奇怪的区域值,例如0,1.5。我不期望小数区域,因为我希望函数返回像素的原始总和,使得一个点的面积为1.对于这个问题,有任何进展吗?它似乎也影响其他衍生价值,如偏心率。我想我可以总结一下这个问题:如何获得连通分量的原始像素数,并使Opencv在需要该区域时正确计算Hu矩和其他导出值?如果不可能,您能否建议一些设计/方法重新调整以规避问题?我本来希望有opencv这样做,所以我可以利用其他功能,如胡矩和椭圆拟合。