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ć.
- Rejestracja:ponad 9 lat
- Ostatnio:prawie 9 lat
- Lokalizacja:Tychy
- Postów:45
- Rejestracja:ponad 9 lat
- Ostatnio:prawie 9 lat
- Lokalizacja:Tychy
- Postów:45
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

- Rejestracja:prawie 12 lat
- Ostatnio:ponad 6 lat
- Postów:231
A debbugowałeś/aś to? Na pewno wyjdzie gdzie jest problem. Potrafisz debugować?

- Rejestracja:prawie 12 lat
- Ostatnio:ponad 6 lat
- Postów:231
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ę :)
- Rejestracja:ponad 9 lat
- Ostatnio:prawie 9 lat
- Lokalizacja:Tychy
- Postów:45
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.

- Rejestracja:prawie 12 lat
- Ostatnio:ponad 6 lat
- Postów:231
No to trzeba zobaczyć co siedzi w metodzie HoughLines2 i przeanalizować czemu nie znajduje.
- Rejestracja:ponad 9 lat
- Ostatnio:prawie 9 lat
- Lokalizacja:Tychy
- Postów:45
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 ;)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.