Projekt C# wiertarka CNC

Własne projekty oraz implementacje.

Moderator: xxSlayeRxx

Projekt C# wiertarka CNC

Sponsor

Sponsor
 

Projekt C# wiertarka CNC

Postprzez CiulanY » Wt wrz 06, 2011 11:29 pm

Buduje wiertarke CNC, założenie jest takie, że na podstawie projektu płytki (obów drukowany) na bazie kolorów ma wykrywać miejsce wiercenia.

Na podstawie dpi licze odległości i przesyłam portem com - działa.

Mam zielone kółka ( program wykrywa prawidłowo kolory na bazie rgb) ale nie wiem jak ustalić środki okręgów po zaimporowaniu pliku .png do programu.

Dodam, że rozpoznawanie koloru przepiega piksel po pikselu liniami.
Zapraszam do dyskusji.
CiulanY
New member
 
Posty: 6
Dołączył(a): Wt wrz 06, 2011 11:25 pm

Re: Projekt C# wiertarka CNC

Postprzez Marcin Miga » Śr wrz 07, 2011 6:40 am

Koła (okręgi) mają to do siebie, że 'z każdej strony' zaczynają się tak samo. Skoro wiesz, gdzie się zaczyna (x1,y), a gdzie kończy (x2,y), to środek będzie w (x1+(x2-x1)/2,y).
Proste.
Marcin Miga
Member
 
Posty: 215
Dołączył(a): Pn maja 17, 2010 2:35 pm

Re: Projekt C# wiertarka CNC

Postprzez CiulanY » Śr wrz 07, 2011 7:09 am

Tak, tylko że pady( kształt koła) maja zazwyczaj wierzchołek z kilku px i fakt gdy jest jeden (albo kilka) pad to jest jak napisałeś, ale gdy jest ich bardzo dużo i położone są w jednej linii problem z określeniem ich środka zaczyna rosnąć

Dołączam fragment kodu

Kod: Zaznacz cały
for (int i = 1; i < projekt.Height-1; i++)
            {
                progresForm.progressBar1.Value = i;
                for (int j = 1; j < projekt.Width-1; j++)
                {
                                        if (projekt.GetPixel(j, i) == kolorWierc && projekt.GetPixel(j, i - 1) != kolorWierc && projekt.GetPixel(j, i + 1) == kolorWierc
                        && projekt.GetPixel(j - 1, i) != kolorWierc && projekt.GetPixel(j + 1, i) == kolorWierc
                        && projekt.GetPixel(j - 1, i + 1) == kolorWierc && projekt.GetPixel(j + 1, i -1) != kolorWierc
                        && projekt.GetPixel(j - 1, i - 1) != kolorWierc && projekt.GetPixel(j + 1, i + 1) == kolorWierc

                        && projekt.GetPixel(j, i - 2) != kolorWierc && projekt.GetPixel(j, i + 2) == kolorWierc
                        && projekt.GetPixel(j - 2, i) != kolorWierc && projekt.GetPixel(j + 2, i) == kolorWierc
                        && projekt.GetPixel(j - 2, i + 2) == kolorWierc && projekt.GetPixel(j + 2, i - 2) != kolorWierc
                        && projekt.GetPixel(j - 2, i - 2) != kolorWierc && projekt.GetPixel(j + 2, i + 2) == kolorWierc
                        )
                    {
                        j1 = j;
                        while (projekt.GetPixel(j, i) == kolorWierc)
                        {
                            j++;
                        }
                        j2 = j-1;
                        tabWier[licznikWier, 0] = (j1+(j1-j2)/2) * px+rWiertla;

                        j = Convert.ToInt32((j1 + (j2 - j1) / 2));

                        i1 = i;
                        while (projekt.GetPixel(j, i) == kolorWierc)
                        {
                            i++;
                        }
                        i2 = i+1;

                        tabWier[licznikWier, 1] = i2 * px+rWiertla;
                        licznikWier++;

                        j = Convert.ToInt16(j2);
                        i = Convert.ToInt16(i1);
                    }
                }
            }


I fakt określenie środka nie jest trudne jeśli ma się pkt bazowe tzn początek i koniec okręgu w pionie i poziomie.
Dodam, że powyższy kod daje mi za dużo pkt
CiulanY
New member
 
Posty: 6
Dołączył(a): Wt wrz 06, 2011 11:25 pm

Re: Projekt C# wiertarka CNC

Postprzez Marcin Miga » Śr wrz 07, 2011 8:39 am

Nie chce mi się analizować kodu, bo i tak na grafice się nie znam, ale skoro daje ci dużo punktów, to zależne jest to od tzw. 'pikselozy'.
Czyli odczytane przez ciebie punty (dla danego x1) powinny składać się na jakiś odcinek (niezbyt długi - zresztą wszystko zależy od wielkości pikseli i wielkości koła). Y dla niego wyznacz sobie jako środek tego odcinka. Będziesz wtedy miał błąd wielkości max 2 piskeli - tak mi się wydaje.

pozdrawiaMM
Marcin Miga
Member
 
Posty: 215
Dołączył(a): Pn maja 17, 2010 2:35 pm

Re: Projekt C# wiertarka CNC

Postprzez CiulanY » Śr wrz 07, 2011 8:47 am

Program sprawdza piksel po pikselu kolor, jeśli napodka na kolor zielony oblicza środek koła a następnie dodaje jego współrzędne do tablicy. Kluczowy jest warunek if w kodzie, który sprawdza czy wykryty w danym momencie jest piksel pierwszy z lewej z góry ( analiza pliku graficznego odbywa się liniami od lewej do prawej, gdzie pierwsza liniia jest na samej górze grafiki)
CiulanY
New member
 
Posty: 6
Dołączył(a): Wt wrz 06, 2011 11:25 pm

Re: Projekt C# wiertarka CNC

Postprzez Spetzu » Śr wrz 07, 2011 9:10 am

Czy występuje sytuacja, gdy wierzchołki położone są w linii ciągłej obok siebie bez żadnych przerw?

W takim przypadku jest problem, jeśli nie da się poznać przybliżonej ilości pikseli składających się na dany wierzchołek.

W pozostałych przypadkach, w momencie gdy napotkasz pierwszy zielony piksel z lewej strony, odpalasz w IF pętlę, która sprawdzi kolejne wierzchołki w tej linii (np. 10), i jeśli któryś z nich nie będzie zielony, to w prosty sposób otrzymujesz dokładny wierzchołek (ilość pixeli / 2). Jeśli natomiast tych wierzchołków będzie dużo w jednej linii, to wracasz do punktu, który opisałem na początku gdzie pady są jeden obok drugiego.
http://www.gankiewicz.eu - programowanie: aplikacje użytkowe, serwisy internetowe i nie tylko ;)
Spetzu
Member
 
Posty: 196
Dołączył(a): Pt sty 07, 2011 5:31 pm

Re: Projekt C# wiertarka CNC

Postprzez CiulanY » Śr wrz 07, 2011 9:28 am

Taka sytuacja występuje praktycznie za każdym razem, tzn wierzchołek składa się np z 5 zielponych px w linni.

Ale to teoretycznie załatwia warunek if sprawdzający kolor pikseli po prawej od pierwszego
CiulanY
New member
 
Posty: 6
Dołączył(a): Wt wrz 06, 2011 11:25 pm

Re: Projekt C# wiertarka CNC

Postprzez CiulanY » Śr wrz 07, 2011 12:20 pm

Działa

zastosowałem rozrost ziarna z rozpoznawaniem koloru
CiulanY
New member
 
Posty: 6
Dołączył(a): Wt wrz 06, 2011 11:25 pm

Re: Projekt C# wiertarka CNC

Sponsors

Sponsor
 


Powrót do Projekty i kody źródłowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość