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

[linux, opencv,] W programie musi być minimum zmiennych do jego poprawnego działania. Że co !?

Ostatnio zmodyfikowano 2013-03-20 17:44
Autor Wiadomość
matka5432
Temat założony przez niniejszego użytkownika
[linux, opencv,] W programie musi być minimum zmiennych do jego poprawnego działania. Że co !?
» 2013-03-16 09:18:35
Witam, w moim programie (a moze kompilatorze) dzieje sie bardzo dziwna rzecz.
Wszystko zaczelo sie, kiedy wstawilem w pewnym miejscu petle, aby zobaczyc czy program nadal bedzie dzialal szybko gdy wykona kilka razy ten sam kod. Kiedy usunalem petle kod nie dzialal, wtedy zaczalem dodawac i usuwac rozne rzeczy z tej petli, az doszedlem do tego, ze wszystko zalezy nie od petli, ale zadeklarowanej zmiennej, ktora byla czescia petli.
Program zaczyna dzialac poprawnie tylko wtedy, gdy w pewnym miejscu zadeklaruje jakas zmienna. Nawet taka, ktora nie ma nic wspolnego z reszta kodu (np int eghoehfgoag = 0;). Program szuka cech podobienstwa wizualnych w obrazie z kamerki do karty z talii. Tych cech jest 11, kiedy nie zadeklaruje tej zmiennej, znajduje tylko 10 cech dlaczego? Najgorsze jest to, ze program wczesniej dzialal dobrze, wiec cofnalem wszystkie zmiany na ctrl + z do momentu, kiedy program dzialal, ale nadal dziejie sie to samo. Nie zwrocil bym na to uwagi, gdyby ta dodatkowa zmienna nie powodowala zacinania sie obrazu.

Kod jest opisany w miejscu z bledem, wiec znajdziecie go bez problemu.
zmienna a - liczba znalezionych cech w pewnym fragmencie obrazu z kamerki.
Tutaj kod:

C/C++
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

#include <iostream>

using namespace std;
using namespace cv;




int main()
{
   
    Mat klatka, img;
    VideoCapture capture = VideoCapture( 0 );
   
    IplImage * karta = cvLoadImage( "/home/mateusz/Pulpit/mala.jpg" );
    img = karta;
   
    IplImage obraz;
    int liczba_pobranych_obrazow_z_kamery = 0;
    float tablica[ 3 ][ 15 ];
    int lol;
    for( int l = 17; l <= 93; l = l + 38 )
    for( int k = 16; k <= 156; k = k + 35 )
    {
        float b;
        float g;
        float r;
        float bb;
        float gg;
        float rr;
        Vec3b a1 = img.at < Vec3b >( l, k );
        b = a1[ 0 ];
        g = a1[ 1 ];
        r = a1[ 2 ];
        if( lol > 0 )
        {
            tablica[ 0 ][ lol ] = bb / b;
            tablica[ 1 ][ lol ] = gg / g;
            tablica[ 2 ][ lol ] = rr / r;
        }
        lol++;
        bb = b;
        gg = g;
        rr = r;
    }
   
    int o = 0;
   
    //Petla z glownym kodem:
    while( 1 )
    {
       
       
       
        capture >> klatka;
        obraz = klatka;
       
        //******************************************************************
       
        int x = 0;
        int y = 0;
        int czy = 0;
       
        //zmienne y(y) i t(t) nie sa teoretycznie potrzebne, z reszta zadnych nie mozna usunac, musi tu byc te 10 zmiennych, inaczej program nie dziala jak nalezy
       
        int yyyyyyyyyyyyyyyyy = 0;
       
        for( int i = 0; i <= 380; i = i + 8 )
        for( int j = 0; j <= 470; j = j + 8 )
        {
           
           
            float tttttttttttttttttt = 0;
           
           
           
            float b2 = 0;
            float g2 = 0;
            float r2 = 0;
           
           
            float b2b = 0;
            float g2b = 0;
            float r2b = 0;
            float asd = 0.50;
            int a = 0;
            int o = 0;
           
            //*****************************************************************
           
            for( int l = 17; l <= 93; l = l + 38 )
            for( int k = 16; k <= 156; k = k + 35 )
            {
               
                Vec3b a1 = klatka.at < Vec3b >( l + i, k + j );
                b2 = a1[ 0 ];
                g2 = a1[ 1 ];
                r2 = a1[ 2 ];
               
                if( o != 4 && o != 9 && o != 14 )
                if( l > 38 || k > 35 )
                {
                    if( tablica[ 0 ][ o ] >( b2b / b2 ) * asd && tablica[ 0 ][ o ] <( b2b / b2 ) *( 1 / asd ) &&
                    tablica[ 1 ][ o ] >( g2b / g2 ) * asd && tablica[ 1 ][ o ] <( g2b / g2 ) *( 1 / asd ) &&
                    tablica[ 2 ][ o ] >( r2b / r2 ) * asd && tablica[ 2 ][ o ] <( r2b / r2 ) *( 1 / asd ) )
                         a++;
                   
                }
               
               
               
               
                b2b = b2;
                g2b = g2;
                r2b = r2;
               
                // a - liczba znalezionych cech podobienstwa. Tutaj kod sprawdza czy zostalo znaleziony w pewnym fragmencie obrazu z kamerki 11 cech.
                if( a > 10 )
                {
                   
                    czy++;
                    x += l + i - 42;
                    y += k + j - 47;
                    cvRectangle( & obraz, cvPoint( j + k - 50, i + l - 45 ), cvPoint( j + k - 44, i + l - 39 ), cvScalar( 255, 0, 0, 0 ), 1, 4, 0 );
                   
                }
               
                o++;
               
            }
           
           
        }
       
        if( czy > 2 )
        {
            cvRectangle( & obraz, cvPoint( y / czy - 100, x / czy - 80 ), cvPoint( y / czy + 100, x / czy + 80 ), cvScalar( 0, 255, 0, 0 ), 2, 4, 0 );
        }
        cout << liczba_pobranych_obrazow_z_kamery << endl;
        liczba_pobranych_obrazow_z_kamery++;
        waitKey( 1 );
        imshow( "lolek", klatka );
        cvShowImage( "karta", karta );
       
    }
   
    return 0;
}
P-78509
krzyk
» 2013-03-16 10:25:44
Kiedyś kiedy używałem DevC++ miałem często podobny problem.
Sprawdź czy zmiana na typ o innej wielkości tej dodatkowej zmiennej ma wpływ na program(char,short),jeśli zawsze musisz mieć 4 bajty może mieć to związek z wyrównywaniem danych(data alignment),dla świętego spokoju olałem DevC-a więc niewiem co trzeba było zmienić.
P-78511
czosnek17
» 2013-03-16 16:54:21
Ja miałem w programie zakomentowane kilka linijek. Żadnych błędów nie było, ale funkcja działała źle. Po jakimś czasie szukania błędu, usunąłem komentarze i zaczęło działać normalnie. Chyba jeszcze gdzieś mam ten kod, dziwna sprawa.

Sprawdź dokładnie kod w pobliżu błędu, może przypadkiem niszczysz gdzieś pamięć zmiennych.
P-78538
Admixior
» 2013-03-16 17:11:19
Zwróć uwagę na argumenty funkcji, czy rozmiary zmiennych lokalnych tam podane są dobre itd.. Być może gdzieś jakiegoś buffer overflowa masz.
A przynajmniej tak to wygląda.
P-78539
matka5432
Temat założony przez niniejszego użytkownika
» 2013-03-16 22:59:29
Kiedy jest przepelnienie pamieci, program wylacza sie zanim zdazy cokolwiek zrobic, wiec to nie jest tego wina. Probowalem zresetowac kompa, ale nie pomoglo. W koncu uznalem, ze nie bede zwracal na to uwagi i dalej bede rowijal program. Po pewnym czasie modyfikowania kodu problem zniknal ;]
Moze to dlatego, ze zadeklarowalem wiecej zmiennych? W przeciwienstwie do opisanej sytuacji, teraz program sie nie zacina po dodaniu tych zmiennych. Jezeli problem sie powtorzy napisze, a narazie wielkie dzieki wszystkim :)
btw. admixior, jakiej funkcji argumenty miales na mysli?
P-78600
Chlorek
» 2013-03-20 17:44:51
Nie wiem czy to komuś pomoże, ale ja gdy jeszcze pisałem pod Dev-C++ (to był błąd, że kiedykolwiek tego używałem) też miałem podobne dziwne zachowania. Potem zorientowałem się, że to IDE coś chrzani czasem i pomaga jedynie na to opcja 'Rebuildu' całego programu zamiast kliknięcia tylko kompilacji. Domyślam się jedynie dlaczego tak może się dziać, ale pewności nie mam, to samo mi się zdarzało i pod Code::Blocks, dlatego zawsze używam opcji 'Rebuild' zamiast 'Compile'.
P-78942
« 1 »
  Strona 1 z 1