ala Detekcja świateł drogowych z opencv

0

Witam
Staram się stworzyć aplikacje która rozpozna czy w danym momencie świeci się zielone czy czerwone światło w obrazie przechwyconym z kamery i wtedy wykona jakaś akcje . Nigdy nie używałem opencv i programista tez nie jestem. Do tej pory dość sporo już wygooglowałem aplikacja będzie działała na podobnej zasadzie opisanej w tym artykule. Wspierałem się przykładami użycia opencv z c++ pythonem i java na tyle ile bylem je wstanie zrozumieć. Obecnie aplikacja wykrywa czerwone pixele w obrazie po czym z czerwonych obszarów wychwytuje wszystkie krawędzie. Teraz staram się wykryć które krawędzie są w kształcie okręgu. Hough Circle już próbowałem nie do końca spełnił moje oczekiwania lub porostu użyłem go niewłaściwie. I właśnie z tym wykryciem okręgów nie umiem sobie poradzić. Jak już dobiorę się do tych okręgów sprawdzę który z nich ma najjaśniejsze czerwone pixele z użyciem Core.minMaxLoc(CzerwoneOkregiGrayScale);. Teoretycznie wtedy w większości przypadków program nie powinien się mylić co do rozpoznania obiektu. To nie ma być aplikacja do samochodów i zakładam ze światło będzie zawsze stało nieruchomo na środku obrazu co ułatwia sprawę. Do tego jeszcze nie doszedłem w poszukiwaniach ale później sprawdzę czy ja się zrobić zooma w opencv z kamery. Prawdopodobnie dodam maskę i kwadrat na środku ekranu który będzie wskazywał obszar zainteresowania do poszukiwań przez algorytm światła. Myślałem tez ze będę porównywać jasność pixeli na okręgu czerwonym i zielonym i w ten sposób chyba będę mógł ocenić które światło obecnie się pali. Jak ktoś ma jakieś propozycje jak się do tego zabrać i zrobić to w prosty sposób .

Edit-- Obecnie mam problem z funkcja approxPolyDP "Error:(1501, 31) error: cannot find symbol variable approxCurve" CRASH :)
Niektóre części kodu nie są używane jak mi to wkoncu wszystko zadziała to trzeba będzie przepisać jeszcze raz.

Jak wykryć kontury które maja kształt okręgu ?

Dziękuje PRZEOGROMNIE za pomoc Panowie i Panie :)

 public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        mRgba = inputFrame.rgba();

        Imgproc.cvtColor(mRgba,imgHSV,Imgproc.COLOR_RGBA2RGB);
        Imgproc.cvtColor(imgHSV,imgHSV,Imgproc.COLOR_RGB2HSV);

        Imgproc.medianBlur(imgHSV,imgHSV,3);


        Core.inRange(imgHSV, new Scalar(0,100,100),new Scalar(10,255,255),imgThreshold);
        Core.inRange(imgHSV, new Scalar(170,100,100), new Scalar(179,255,255),imgThreshold2);
        Mat red_hue_image= new Mat();
        Mat red_rgb_image = new Mat();
        Core.addWeighted(imgThreshold,1.0,imgThreshold2,1.0,0.0,red_hue_image);


        //Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(1,1));
        // Imgproc.erode(red_hue_image,red_hue_image,kernel);
        //Imgproc.dilate(red_hue_image,red_hue_image,kernel);
       
        List<MatOfPoint> contoursPoints = new ArrayList<MatOfPoint>();
        Mat circles = new Mat();


        Mat RedEdges = new Mat();
        //Mat mDilatedMask = new Mat();
        // Imgproc.dilate(red_hue_image,mDilatedMask, new Mat());
        Mat mHierarchy = new Mat();



     // mRgba.copyTo(red_rgb_image,red_hue_image);
     // Imgproc.cvtColor(red_rgb_image,red_rgb_image,Imgproc.COLOR_RGBA2GRAY);
      Imgproc.Canny(red_hue_image,RedEdges,100,150);



        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        List<MatOfPoint2f> contours2f = new ArrayList<MatOfPoint2f>();
        Imgproc.findContours(RedEdges, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
        MatOfPoint2f contour2f = new MatOfPoint2f();


        // Find max contour area
        double maxArea = 0;
        Iterator<MatOfPoint> each = contours.iterator();

        while (each.hasNext())
        {
            double aprox = 0.01*Imgproc.arcLength(contour2f,true);
            MatOfPoint wrapper = each.next();
            wrapper.convertTo(contour2f, CvType.CV_32F);
            Imgproc.approxPolyDP(contour2f,aprox,true);
            double area = Imgproc.contourArea(wrapper);
            if (area > maxArea)
                maxArea = area;

            if(aprox>8&aprox<24&area>30){

                contours2f.add(contour2f);
            }
        }
            contours.clear();
        for(MatOfPoint2f cont : contours2f){
            MatOfPoint contConverted = new MatOfPoint();
            cont.convertTo(contConverted,CvType.CV_32FC2);
            contours.add(contConverted);
            Imgproc.drawContours(mRgba,contours,-1,new Scalar(90, 90, 255));
        }
0

a próbowałeś to zrobić tak jakbyś rozpoznawał twarze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1