2

私は OpenCv4Android ライブラリを使用しており、サンプル プログラム color-blob-detection を使用しています。これでは、輪郭を描くために、最初に次の式でフィルタリングします:(輪郭の面積> 0.1 *(最大の輪郭の面積)

 if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) {
            Core.multiply(contour, new Scalar(4,4), contour);
            mContours.add(contour);

その後、フィルタリングされた輪郭のそれぞれにスカラー乗算を使用しました。その目的は何ですか?いくつかの小さな輪郭をマージすることですか?アイデアがわかりませんでした。啓発してください!! 第二に、なぜ彼らは乗算係数 Scalar(4,4) を使用したのか、なぜ他のものを使用しなかったのか。

コード :

    Imgproc.pyrDown(rgbaImage, mPyrDownMat);
    Imgproc.pyrDown(mPyrDownMat, mPyrDownMat);

    Imgproc.cvtColor(mPyrDownMat, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL);

    Core.inRange(mHsvMat, mLowerBound, mUpperBound, mMask);
    Imgproc.dilate(mMask, mDilatedMask, new Mat());

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

    Imgproc.findContours(mDilatedMask, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

    // Find max contour area
    double maxArea = 0;
    Iterator<MatOfPoint> each = contours.iterator();
    while (each.hasNext()) {
        MatOfPoint wrapper = each.next();
        double area = Imgproc.contourArea(wrapper);
        if (area > maxArea)
            maxArea = area;
    }

    // Filter contours by area and resize to fit the original image size
    mContours.clear();
    each = contours.iterator();
    while (each.hasNext()) {
        MatOfPoint contour = each.next();
        if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) {
            Core.multiply(contour, new Scalar(4,4), contour);
            mContours.add(contour);

    Imgproc.drawContours(mRgba, mContours, -1, CONTOUR_COLOR);
4

2 に答える 2

1

コードを見ると、最初にこれを使用していることがわかります。

Imgproc.pyrDown(rgbaImage, pyrDownMat); //Divide length and height by 2
Imgproc.pyrDown(pyrDownMat, pyrDownMat); //Divide length and height by 2

これらの行では、フレームの長さと高さが 4 で除算されます。これにより、必要な処理時間が短縮されます。輪郭を元のフレームに戻すには、長さと高さを 4 ずつサイズ変更する必要があります。そのため、この線が使用されます。

new Scalar(4,4)

私はそれを明確にしたことを願っています;)

于 2013-02-27T19:00:23.513 に答える
0

当分の間、私は質問に完全に答えることができませんが、ここに私が得たものがあります。

Core.multiply(contour, new Scalar(4,4), contour);

最初のパラメーターはソース マトリックス、2 番目は倍率、3 番目は結果のマトリックスです。これを念頭に置いている場合、そのコードはソースの輪郭を 4 倍にスケーリングしています。

なぜ4?これはわかりませんが、そのコードの上のコメント- 「元の画像サイズに合わせてサイズを変更する」 -そのフィッティングを行うという考えだったと思いますが、輪郭を4倍することでそれを達成する方法がわかりません.

于 2013-02-13T20:05:14.450 に答える