Nie działająca funkcja w WPF

0

Witam,
problem mój polega na tym, że mam funkcję która znajduje mi na obrazku linie i funkcja ta działa mi w projekcie który sobie stworzyłem do sprawdzania takich funkcji(jest to "Empty Projekt") no i kopiując taka funkcje do aplikacji, którą mam w WPF ta funkcja mi nie działa, znaczy się wszystko działa funkcja się wywołuje, nie ma żadnych błędów, natomiast obraz który mi się wyświetla nie ma tych "znalezionych" narysowanych linii, gdzie w przypadku "pustego projektu" to działa, no i moje pytanie jest takie czym to może być spowodowane? Wszystkie parametry są takie same, nawet dla sprawdzenia wziąłem ten sam obrazek, wczytywany jest dokładnie tak samo jak w przypadku pierwszej aplikacji a mimo to efekt jest ten sam. Jeżeli będzie trzeba to mogę te funkcje tutaj wrzucić.

0

Daj przykłady wersji działającej i nie działającej.

0

Sama funkcja wyglada tak:

        public IplImage Find(IplImage szary, IplImage kolor)
        {

            IplImage polki = Cv.CreateImage(new CvSize(kolor.Width, kolor.Height), BitDepth.U8, 3);
            Cv.Copy(kolor, polki);

            using (IplImage srcImgProb = kolor.Clone())
            {
                Cv.Canny(szary, szary, 50, 200, ApertureSize.Size3);
                using (CvMemStorage storage = new CvMemStorage())
                {
                    // Standard algorithm
                    CvSeq lines = szary.HoughLines2(storage, HoughLinesMethod.Standard, 1, Math.PI / 180, 50, 0, 0);
                    // wrapper style
                    //CvLineSegmentPolar[] lines = src_img_gray.HoughLinesStandard(1, Math.PI / 180, 50, 0, 0);


                    int limit = Math.Min(lines.Total, 10);
                    for (int i = 0; i < limit; i++)//i-ilosc lini jakie znajdziemy
                    {
                        // wrapper style
                        CvLineSegmentPolar elem = lines.GetSeqElem<CvLineSegmentPolar>(i).Value;
                        float rho = elem.Rho; //dlugosc lini
                        float theta = elem.Theta; //kat lini

                        double a = Math.Cos(theta);
                        double b = Math.Sin(theta);
                        double x0 = a * rho;
                        double y0 = b * rho;
                        CvPoint pt1 = new CvPoint { X = Cv.Round(x0 + 1000 * (-b)), Y = Cv.Round(y0 + 1000 * (a)) };
                        CvPoint pt2 = new CvPoint { X = Cv.Round(x0 - 1000 * (-b)), Y = Cv.Round(y0 - 1000 * (a)) };
                        polki.Line(pt1, pt2, CvColor.Red, 3, LineType.AntiAlias, 0);

                    }


                    // Probabilistic algorithm
                    lines = szary.HoughLines2(storage, HoughLinesMethod.Probabilistic, 1, Math.PI / 180, 50, 50, 10);
                    // wrapper style
                    //CvLineSegmentPoint[] lines = src_img_gray.HoughLinesProbabilistic(1, Math.PI / 180, 50, 0, 0);


                    for (int i = 0; i < lines.Total; i++)//ewentualnie lines.total
                    {
                        // wrapper style
                        CvLineSegmentPoint elem = lines.GetSeqElem<CvLineSegmentPoint>(i).Value;
                        srcImgProb.Line(elem.P1, elem.P2, CvColor.Red, 3, LineType.AntiAlias, 0);
                    }
                }

                //wyswietlenie wynikow w oknie
                using (new CvWindow("znalezione_linie", WindowMode.AutoSize, polki))
                //using (new CvWindow("Hough_line_probabilistic", WindowMode.AutoSize, srcImgProb))
                {
                    CvWindow.WaitKey(0);
                }
            }

            return polki;
        } 

A tutaj linki do zdjeć:
http://zapodaj.net/fad54de436b8a.png.html
http://zapodaj.net/79f29cd198b26.png.html

0

A czym są parametry tej funkcji:

IplImage szary, IplImage kolor

?

1

A debbugowałeś/aś to? Na pewno wyjdzie gdzie jest problem. Potrafisz debugować?

0

A na pewno zastępujesz stary obraz nowym? - niby oczywiste ale taki rzeczy się najdłużej szuka :P.

0

Tak zastępuje, co do debugowania tak umiem z tym że, w tej chwili jak to debuguje to mi się za petla w pewnym miejscu co jest tym bardziej dziwne że program po normalnym uruchomieniu działa normalnie.

0
Qarku napisał(a):

Tak zastępuje, co do debugowania tak umiem z tym że, w tej chwili jak to debuguje to mi się za petla w pewnym miejscu co jest tym bardziej dziwne że program po normalnym uruchomieniu działa normalnie.

hmm. to piszesz coś i nie wiesz jak to działa? skoro program działa (tj nie ma not responding) to znaczy że się nic nie zapętliło w nieskończoność (w wątku głównym) ale skoro piszesz jedno a myślisz drugie no to znaczy że masz gdzieś rozbieżność i nie jesteś pewna/y jak kod się wykonuje. podstawowa zasada to rozumieć jak kod zadziała. pisanie bez myślenia nie ma sensu. wróć jeszcze raz do debugowania i "dojdź" do tego jak to działa a jak już zrozumiesz "jak to działa" to na pewno rozwiążesz problem czemu "nie działa" :D zagmatwałem trochę :)

0

Dobra kwestia z debugowaniem rozwiązana musiało to dość długo trwać bo breakpoint załatwił sprawe :)
Natomiast problem leży w tutaj:

CvSeq lines = szary.HoughLines2(storage, HoughLinesMethod.Standard, 1, Math.PI / 180, 50, 0, 0);
                    // wrapper style
                    //CvLineSegmentPolar[] lines = src_img_gray.HoughLinesStandard(1, Math.PI / 180, 50, 0, 0);


                    int limit = Math.Min(lines.Total, 10);
 

Natomiast dalej nie wiem czemu

HoughLines2 

nie znajduje tych linii.

0

No to trzeba zobaczyć co siedzi w metodzie HoughLines2 i przeanalizować czemu nie znajduje.

0

Udało mi się problem rozwiązać, problem polegał na tym że obraz wczytany w odcieniach szarości a obraz przerobiony z kolorowego na szary się różni i w tym jest problem. Także po prostu przy wczytaniu obrazu muszę go o razu wczytywać tez w odcieniach szarości ;)

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