Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Opencv和C++;查找可能自相交的非常小对象的区域_C++_Opencv_Contour_Area_Self Intersection - Fatal编程技术网

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

C++ 使用Opencv和C++;查找可能自相交的非常小对象的区域,c++,opencv,contour,area,self-intersection,C++,Opencv,Contour,Area,Self Intersection,如何计算非常小的对象的面积,有时面积为2像素?MATLAB的regionprops()似乎做得很好,对于一个点,它将返回甚至为1的值。关于这个问题,我读了很多书,每个人似乎都在警告不要使用自相交的轮廓线,但在这方面没有其他选择。以下是我的代码示例: void cMcDetect::shapeFeats(vector<Point> contours, const cv::Mat &img) { // % Area, Compactness, Orientation, E

如何计算非常小的对象的面积,有时面积为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);

}
void cMcDetect::shapefeat(矢量轮廓、常量cv::Mat和img)
{
//面积百分比、压实度、方向、偏心率、坚固度
双A,C,O=NAN,E,S;
向量ch;凸形(轮廓,ch);
力矩mu=力矩(等高线,0);
双CHA=轮廓面积(ch);
A=轮廓区域(轮廓);//对象区域
S=A/CHA;//坚固性
E=(mu.m20+mu.m02+sqrt(pow(mu.m20-mu.m02,2)+4*pow(mu.m11,2))///
(mu.m20+mu.m02-sqrt(pow(mu.m20-mu.m02,2)+4*pow(mu.m11,2));
Rect boundrect=boundingRect(等高线);//紧致度
C=A/(边界矩形宽度*边界矩形高度);
如果(等高线.size()>=5){
RotatedRect rotrect=FIT椭圆(轮廓);//方向
O=旋转直角;
}
printf(“%f%f%f%f%f\n”,A、C、O、E、S);
}
我得到了非常奇怪的面积值,比如对象面积的0,1.5。我不期望十进制区域,因为我期望函数返回像素的原始和,这样一个点的面积为1。在这个问题上有什么进展吗?它似乎也会影响其他衍生值,如偏心率。我想我可以将问题总结为:如何获得连接组件的原始像素计数,并使Opencv在需要面积的地方正确计算Hu矩和其他派生值?如果不可能,您能否建议一些设计/方法调整以避免该问题?我希望opencv能够做到这一点,这样我就可以利用它的其他功能,如hu矩和椭圆拟合