接続されたコンポーネントを見つけて、それらに対していくつかのタスクを実行できる OpenCV 関数を探しています (オブジェクト内のピクセル数、輪郭、ピクセルのリストなどを取得するなど)。
MatLab の regionprops に似た OpenCV (C++) の機能はありますか?
接続されたコンポーネントを見つけて、それらに対していくつかのタスクを実行できる OpenCV 関数を探しています (オブジェクト内のピクセル数、輪郭、ピクセルのリストなどを取得するなど)。
MatLab の regionprops に似た OpenCV (C++) の機能はありますか?
バージョン 3.0 から、OpenCV にconnectedComponents
機能が追加されました。
cvFindContours関数を見てください。非常に用途が広く、内部と外部の両方の輪郭を検出し、結果をさまざまな形式 (フラット リストとツリー構造など) で返すことができます。輪郭を取得したら、 cvContourAreaなどの関数を使用して、特定の輪郭に対応する接続コンポーネントの基本的なプロパティを決定できます。
(上記で説明した古い C スタイルのインターフェイスではなく) 新しい C++ インターフェイスを使用する場合は、関数名が似ています。
OpenCV を使用する外部ライブラリを使用してもかまわない場合は、cvBlobsLibを使用してそれを行うことができます。
バイナリ イメージの連結成分ラベリングを実行するためのライブラリ ( regionprops Matlab function に似ています)。また、抽出されたブロブから結果を操作、フィルタリング、および抽出する機能も提供します。詳細については、機能のセクションを参照してください。
cv::connectedComponentsWithStats()関数を使用できます。
ここに例があります。
// ...
cv::Mat labels, stats, centroids;
int connectivity = 8; // or 4
int label_count = cv::connectedComponentsWithStats(src, labels, stats, centroids, connectivity);
for (int i = 0; i < label_count; i++)
{
int x = stats.at<int>(i, cv::CC_STAT_LEFT);
int y = stats.at<int>(i, cv::CC_STAT_TOP);
int w = stats.at<int>(i, cv::CC_STAT_WIDTH);
int h = stats.at<int>(i, cv::CC_STAT_HEIGHT);
int area = stats.at<int>(i, cv::CC_STAT_AREA);
double cx = centroids.at<double>(i, 0);
double cy = centroids.at<double>(i, 1);
// ...
}