matka5432 Temat założony przez niniejszego użytkownika |
[Opencv] Dwukrotnie pomniejszony obraz - Czyli na 1 pixel przypadaja 4. Dlaczego? » 2013-03-24 16:55:29 Witam, mamy taki problemik. Najpierw kod: #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { IplImage * pobrany = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); Mat obrazek = pobrany; IplImage obraz = obrazek; for( int i = 0; i <= 500; i += 1 ) for( int j = 0; j <= 500; j += 1 ) { cvLine( & obraz, cvPoint( j, i ), cvPoint( j, i ), cvScalar( 0, 255, 255 ), 1, 1, 1 ); } cvShowImage( "obraz", & obraz ); cvShowImage( "pobrany", pobrany ); imshow( "obrazek", obrazek ); waitKey( 10000 ); return 0; }
Problem jest taki, ze obraz o nazwie "pobrany" ma wymiary 500 na 500 px, jak widac petla rowniez jest przeznaczona na zapelnienie kolorem obrazu o wymiarach 500 na 500. Niestety efekt jest taki, ze 1/4 obrazu jest zakolorowana na zolto, czyli 250 na 250 px. Jezeli w petli zmienie oba wymiary z 500 na 1000 efekt jest taki jaki chcialbym uzyskac, ale wymairy w petli nie moga byc 2 razy wieksze (spowalnia do dzialanie programu czterokrotnie). Chcialbym dowiedziec sie gdzie tkwi problem. Kiedy sprawdzalem jak sa rysowane pixele, jeden po drugim, zauwazylem, ze kazdy nastepny pixel rysuje sie co drugi przejscie przez petle :] |
|
DejaVu |
» 2013-03-24 20:12:42 IplImage * pobrany = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); Mat obrazek = pobrany; IplImage obraz = obrazek;
Skąd wytrzasnąłeś powyższy kod? Wygląda on bezsensownie... |
|
matka5432 Temat założony przez niniejszego użytkownika |
» 2013-03-24 20:54:21 Jako calosc sam go zlozylem. Oczywiscie pojedynczych linijek nauczylem sie gdzies w internecie. Jesli chodzi ci o to, ze kopiuje obrazek do obrazka, to robie to dlatego, ze chce miec obrazek w 2 formatach, bo na jednym formacie moge robic pewne rzeczy, a na drugim inne. Te 2 formaty moga miedzy soba sie kopiowac. Ten trzeci (czyli ten na poczatku kodu z gwiazdka *) jest po to, aby stworzyc sam obrazek. Niby sa funkcje do kopiowania danych formatow miedzy soba, mozna tworzyc obrazki w innych formatach, ale jest tyle funkcji, ze wole sobie zapamietac kilka i kopiowac to kilka razy. Chyba ze bardzo zalezalo by mi na szybkosci, to bym poszukal na necie. na przyklad taka linijka: obraz = pobrany czy &obraz = pobrany bedzie zla, a w logu pokaze mi sie informacja, ze iplimage cos tam do iplimage jakiegos tam nie moze sie przekonwertowac. (nie nzam nazw tych formatow) |
|
DejaVu |
» 2013-03-25 11:59:29 No bo żadna z wypisanych przez Ciebie linijek nie jest poprawna, więc nie zadziała :) W pierwszym przypadku próbujesz wykonać przypisanie wskaźnika do obiektu, a w drugim przypadku... to już totalnie abstrakcyjny kod przedstawiłeś. |
|
matka5432 Temat założony przez niniejszego użytkownika |
» 2013-03-26 08:08:31 Niebardzo rozumiem o co ci chodzi, dlaczego abstrakcyjny, i dlaczego mowisz, ze kazda z wypisanych linijek jest niepoprawna. Poza tym na wszystkich kursach poszczegolne linijki sa takie same. Moglbys dokladniej napisac o co ci chodzi ? Przypominam, ze kod dziala, ale obraz jest pomniejszony dwukrotnie, aby byl w skali 1:1 koordynacja rysowania pixelu, musi byc za kazdym razem 2 razy wieksza (np. zamiast 160 to 320). WTedy wszystko dziala jak nalezy. |
|
krzyk |
» 2013-03-26 10:34:40 <= 500 to chyba za daleko.
W cvLine ostatni parametr shift jest trochę podejrzany spróbuj dać 0.
A tak wogóle czemu używasz cvLine zamiast cvSet2d? |
|
DejaVu |
» 2013-03-26 11:26:56 |
|
matka5432 Temat założony przez niniejszego użytkownika |
» 2013-03-26 12:32:38 Dla przykladu ta linijka (z kursu): IplImage* hist_img = cvCreateImage( cvSize( h_bins * scale, s_bins * scale ), 8, 3 ); i ta (moja): IplImage *pobrany = cvCreateImage(cvSize(500,500),8,3); Niczym sie nie roznia. Rozumiem, ze mam znalezc wszystkie tutoriale, w ktorych znajduje sie jedna z linijek z mojego kodu, i ci je pokazac? Bo powiedzialem, ze pojedyncze linijki wzialem z tutoriali, ale poskladalem je w calosc sam. Jezeli chodzi ci o to, w jaki sposob zlozylem kod to moze i masz racje, iz nie jest to rewelacja, ale dla mnie sie liczy, ze kod dziala tak jak powinien, ja rozumiem o co w nim chodzi, a program dziala szybko i nie zzera duzo pamieci. Mozesz mi powiedziec jak powinien wygladac kod, zeby byl "rzeczywisty" ?
taa, w parametrze shift powinno byc 0. Ile razy wieksza liczba, tyle razy mniejszy obraz. Wielkie dzieki Krzyk :) I masz racje, powinno byc <500 ;p. Co do lini, to nie wiedzialem nigdy, ze istnieje taka funkcja jak cvSet2d. Trafilem na dokumentacje opencv i nie znalazlem. Szukalem czegos jak "putpixel". |
|
« 1 » 2 |