2

如何计算非常小的物体的面积,有时面积为 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 这样做,这样我就可以利用它的其他功能,例如 hu 矩和椭圆拟合。

4

0 回答 0