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: #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; while( 1 ) { capture >> klatka; obraz = klatka; int x = 0; int y = 0; int czy = 0; 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; 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; }
|
|
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ć. |
|
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.
|
|
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. |
|
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? |
|
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'. |
|
« 1 » |