使用Opencv和C ++查找非常小的对象区域,可能是自相交的

时间:2016-07-31 23:22:16

标签: c++ opencv contour area self-intersection

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

0 个答案:

没有答案