Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Opencv] Dwukrotnie pomniejszony obraz - Czyli na 1 pixel przypadaja 4. Dlaczego?

Ostatnio zmodyfikowano 2013-03-26 14:35
Autor Wiadomość
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:
C/C++
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
    //zadeklarowanie obrazow.
    IplImage * pobrany = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
    Mat obrazek = pobrany;
    IplImage obraz = obrazek;
    //petla wypelniajaca obrazy danym kolorem (w tym przypadku zoltym).
    for( int i = 0; i <= 500; i += 1 )
    for( int j = 0; j <= 500; j += 1 )
    {
        //narysowanie pixela na drugim obrazie. (jesli narysuje cos w obrazie "obraz" na obrazach "obrazek" i "pobrany" narysuje sie dokladnie to samo w tym samym miejscu)
        cvLine( & obraz, cvPoint( j, i ), cvPoint( j, i ), cvScalar( 0, 255, 255 ), 1, 1, 1 );
    }
    //wyswietlenie wszystkich obrazow
    cvShowImage( "obraz", & obraz );
    cvShowImage( "pobrany", pobrany );
    imshow( "obrazek", obrazek );
    //odczekanie 10 sekund
    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 :]
P-79320
DejaVu
» 2013-03-24 20:12:42
C/C++
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...
P-79331
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)
P-79334
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ś.
P-79341
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.
P-79398
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?
P-79401
DejaVu
» 2013-03-26 11:26:56
Skoro twierdzisz, że 'wszystkie' tutoriale tak pokazują, że należy robić to:
1. pokaż te tutoriale;
2. wytłumacz co robi każda z tych linijek.

http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html
http://www.abstractnew.com/2009/11/getting-started-with-opencv-part-2.html

Idąc Twoim tokiem rozumowania to program, który pisze poza zakresem tablicy i działa jest również poprawny.
P-79403
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".
P-79407
« 1 » 2
  Strona 1 z 2 Następna strona