如何计算非常小的物体的面积,有时面积为 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 矩和椭圆拟合。