非常に小さいオブジェクト (面積が 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 モーメントやその他の派生値を正しく計算するにはどうすればよいですか? 不可能な場合は、問題を回避するための設計/アプローチの再調整を提案できますか? hu モーメントや楕円フィッティングなどの他の機能を利用できるように、opencv にそれを実行してもらいたいと思っていました。