01/10/2018, 00:29

Xác định đường viền của 1 tia laser bằng OpenCV

Em đang làm bài tập dùng OpenCv để nhận diện đường viền của 1 tia laser như hình đây:

nhưng khi em làm thì nó lấy cả khoảng tia đỏ bên rìa nữa, hình như đây:
Các a có thể giúp e lấy khoảng màu chuẩn trong vòng đấy đc ko ạ,
Đây là source :

    Mat mtCircles = new Mat();
    double[] data;
    List<Point> circlesPoint = new ArrayList<>();
    Mat mtDetectCires = new Mat(mBitmap.getWidth(), mBitmap.getHeight(), CvType.CV_8UC1);
    mtOrgBitmap = mtDetectCires.clone();
    Utils.bitmapToMat(mBitmap, mtDetectCires);
    Imgproc.medianBlur(mtDetectCires, mtDetectCires, 3);
    Imgproc.cvtColor(mtDetectCires, mtDetectCires, Imgproc.COLOR_RGB2HSV);

    Mat lower_red_hue_range = new Mat();
    Mat upper_red_hue_range = new Mat();
    Mat red_hue_image = new Mat();

    Core.inRange(mtDetectCires, new Scalar(0, 100, 100), new Scalar(10, 255, 255), lower_red_hue_range);
    Core.inRange(mtDetectCires, new Scalar(160, 100, 100), new Scalar(179, 255, 255), upper_red_hue_range);
    Core.addWeighted(lower_red_hue_range, 1.0, upper_red_hue_range, 1.0, 0.0, red_hue_image);

    Imgproc.blur(red_hue_image, red_hue_image, new Size(9, 9));
    Imgproc.threshold(red_hue_image, red_hue_image, -1, 255
            , Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU);

    List<MatOfPoint> contours = new ArrayList<>();
    Imgproc.findContours(red_hue_image, contours, new Mat()
            , Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Quangg Hà viết 02:33 ngày 01/10/2018

có ai giúp em ko ak.

Văn Dương viết 02:43 ngày 01/10/2018

Nhìn trên hình có thể thấy ngưỡng của cậu chưa chuẩn (quá thấp)
Mà mỗi đường viền sao mà khổ vậy ?
Biến nó thành ảnh xám. Dùng thuật toán loang và ngưỡng để xác định .
Nếu loang đến pixel có mức xám nhỏ hơn ngưỡng -> đã chạm biên-> đánh dấu pixel đó.
Tập hợp các pixel sẽ là đường viền.

Quangg Hà viết 02:32 ngày 01/10/2018

cảm ơn cậu, mình đã đổi theo hệ màu HSV của OpenCv và tìm ra được ngưỡng rồi.

Bài liên quan
0