wykrywanie koła na obrazie.

0

Witam, tworzę dość rozbudowaną aplikację, ale póki co utknęłam w jednym miejscu. Mianowicie na wykrywaniu koła na obrazie. Korzystam z bibliotek javacv i opencv w srodowisku NetBeans 7.1. Z samym wykryciem koła na obrazie problemu nie ma bo metoda działa bez problemu, gdy podaję ścieżkę do konkretnego obrazu. Chciałabym jednak aby działała do wduszeniu przycisku na każdym, WCZESNIEJ ZALADOWANYM ZDJECIU. Ponizej wrzucę kawałek kodu, odpowiedzialny za to wykrywanie. Proszę o pomoc - co robię źle? pozdrawiam

   public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == load) {
            String sciezka = tekst.getText();
            if ((sciezka != null) && (sciezka.length() > 0)) {
                IplImage image = cvLoadImage(sciezka);
                final CanvasFrame canvas = new CanvasFrame("ramka");
                canvas.showImage(image);
                canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
            } else {
                JOptionPane.showMessageDialog(this, "Nie podano ścieżki");
            }
        }

        if (source == wykryj) {

            IplImage src = image;
            IplImage gray = cvCreateImage(cvGetSize(src), 8, 1);

            cvCvtColor(src, gray, CV_BGR2GRAY);
            cvSmooth(gray, gray, CV_GAUSSIAN, 3);

            opencv_core.CvMemStorage mem = opencv_core.CvMemStorage.create();

            opencv_core.CvSeq circles = cvHoughCircles(
                    gray, //Input image
                    mem, //Memory Storage
                    CV_HOUGH_GRADIENT, //Detection method
                    1, //Inverse ratio
                    100, //Minimum distance between the centers of the detected circles
                    100, //Higher threshold for canny edge detector
                    100, //Threshold at the center detection stage
                    15, //min radius
                    500);

            for (int i = 0; i < circles.total(); i++) {
                opencv_core.CvPoint3D32f circle = new opencv_core.CvPoint3D32f(cvGetSeqElem(circles, i));
                opencv_core.CvPoint center = cvPointFrom32f(new opencv_core.CvPoint2D32f(circle.x(), circle.y()));
                int radius = Math.round(circle.z());
                cvCircle(src, center, radius, opencv_core.CvScalar.GREEN, 6, CV_AA, 0);
            }
            cvShowImage("Result", src);
            cvWaitKey(0);
        }
0

Nie widze w tym kodzie nigdzie żebyś zapisywała gdziekolwiek te otwarte obrazy ani wyniki poszukiwania kół.

0

Pokaż obrazek z którym masz kłopot.


A wiem z czym jest kłopot. Bezmyślnie kopiujesz przykłady z OpenCV. Zapewne używasz jakiegoś freamworka Java do tworzenia UI, który zapewnia już event loopa, obsługę klawiatury itp. Tymczasem ty skopiowałaś event loopa z przykładu: `cvWaitKey(0);` co prowadzi do nieprzewidzianych efektów. Wywal to, oraz `cvShowImage("Result", src);`. Dokonaj konwersji macierzy do czegoś co jest zrozumiałe dla frameworka UI, który stosujesz w swoim programie i wyświetl go normalnie.

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