5

画像から検出された輪郭/ブロブのセットがあります。問題は、ブロブの検出とスムージング中に一部のブロブが分割されることです。次のコードを使用しようとしました。

Mat outlines=Mat::zeros(m3.size(),CV_8UC3);
findContours(m3,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,Point(0,0));
//Approximate Contours
std::vector<std::vector<cv::Point> > contours_poly( contours.size() );
for( int i = 0; i < contours.size(); i++ ) {
    approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 5, true );
    std::vector<cv::Point> hull;
    cv::convexHull(cv::Mat(contours_poly[i]),hull);
    cv::Mat hull_points(hull);
    cv::RotatedRect rotated_bounding_rect = minAreaRect(hull_points);
    Point2f vertices[4];
    if(rotated_bounding_rect.size.area()==0){
        continue;
    }
    rotated_bounding_rect.points(vertices);
    for (int i = 0; i < 4; ++i)
    {
        cv::line(outlines, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 1, CV_AA);
    }
}

問題は、これらの輪郭が検出され、このapproxPolyDP方法を使用して結合されたとしても、小さなブロブが単独であり、近くに他のブロブがない場合でも、一部の小さなブロブが消失することです。

私が望むのは、結合するのに非常に近いブロブ、またはそれらの少なくとも 1 つを輪郭のリストから削除し、残りをすべて保持する必要があることです。

以下は、私の質問をより明確にする最初と最後の画像です。初期イメージ:
http://sdrv.ms/1bp8x89
最終イメージ:
http://sdrv.ms/1bp8tp5

最終的な画像でわかるように、一部のブロブが適切に結合されていない場合でも、画像の右側にある小さなブロブが失われています。

また、この手法では、1 つのフレームに数秒かかります。ビデオを考えると、この手法は非常に非効率的になります。

いくつかの救済策を提案してください。

4

2 に答える 2

5

膨張と呼ばれる画像の形態学的変換を提案できます

ウィキリンク

OpenCV

于 2013-10-01T19:53:41.163 に答える
5

この別の同様の質問へのリンクが機能することを願っています。彼らはこの問題を失礼な方法で解決します。機能する場合は、最適化に進みます。

この問題を解決しようとする関数を含むライブラリについては、openCV に 2 つ (groupRectangles & partition) ありますが、問題を解決できない可能性があります。

リンクは次のとおりです

于 2014-01-21T16:34:46.773 に答える