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

[OpenCV]Pełne zakończenie programu

Ostatnio zmodyfikowano 2011-11-12 09:59
Autor Wiadomość
Trix
Temat założony przez niniejszego użytkownika
[OpenCV]Pełne zakończenie programu
» 2011-11-11 12:47:00
Wzorując się na przykładzie napisałem program pokazujący obraz z kamerki + jej negatyw.
Po kliknięciu 'q' apliakcja powinna się wyłączyć, tak się nie dzieje gdyż okno co prawda się wyłącza lecz konsola pozostaje nienaruszona i proces dalej jest aktywny.
Co powinienem zrobić w takiej sytuacji?

Jak w ogóle pozbyć się tej konsoli?

Kod:
C/C++
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <stdio.h>

#pragma comment(lib, "opencv_highgui231d.lib")
#pragma comment(lib, "opencv_core231d.lib")

int x, y;
bool window = false;
CvFont font;
void negatyw( IplImage * image ) {
    int s, w, k;
    for( s = 0; s < image->width; s++ ) for( w = 0; w < image->height;
    w++ ) for( k = 0; k < image->nChannels; k++ )
    image->imageData
    [ w * image->widthStep + s * image->nChannels + k ]
    = 255 -
    image->imageData
        [ w * image->widthStep + s * image->nChannels + k ];
   
}
void mouse( int event, int _x, int _y, int flags, void *
parm )
{
    switch( event ) {
    case CV_EVENT_LBUTTONUP:
        std::cout << "Wciśnięto lewy przycisk myszy na pozycji [ " << _x << ',' << _y << " ]\n";
        if( _x > 100 && _x < 200 && _y > 100 && _y < 200 ) {
            window =!window;
            if( window )
                 cvNamedWindow( "Negatyw" );
            else
                 cvDestroyWindow( "Negatyw" );
           
        }
        break;
    case CV_EVENT_MOUSEMOVE:
        x = _x;
        y = _y;
    }
}
int main( int argc, char * argv[] )
{
    IplImage * img;
    cvInitFont( & font, CV_FONT_HERSHEY_COMPLEX_SMALL | CV_FONT_ITALIC, 1, 1, 0, 2 );
    CvCapture * capture = cvCaptureFromCAM( 0 );
    cvNamedWindow( "View" );
    cvSetMouseCallback( "View", mouse, NULL );
    if( !capture ) {
        std::cout << "kamera nie istnieje " << std::endl;
        exit( - 1 );
    }
    if( !cvGrabFrame( capture ) ) {
        std::cout << "Nie udało się pobrać klatki z kamery" << std::endl;
        exit( - 1 );
    }
    img = cvRetrieveFrame( capture );
    CvPoint srodek = cvPoint( img->width / 2, img->height / 2 );
    while( 1 ) {
        /* Pobranie klatki */
        if( !cvGrabFrame( capture ) ) {
            std::cout << "Nie udało się pobrać klatki z kamery " << std::endl;
            exit( - 1 );
        }
        img = cvRetrieveFrame( capture );
        /* Edytowanie orginalnego obrazka */
        cvLine( img, cvPoint( x, y ), srodek, cvScalar( 255, 255, 0 ), 5 );
        cvRectangle( img, cvPoint( 100, 100 ), cvPoint( 200, 200 ), cvScalar( 255, 0, 0 ), 1 );
        /* Okno widoku */
        cvShowImage( "View", img );
        /* Okno negacji */
        if( window ) {
            negatyw( img );
            cvPutText( img, "Test negacji", cvPoint( 200, 105 ), & font, cvScalar( 255, 255, 0 ) );
            cvShowImage( "Negatyw", img );
        }
        /* Wyjście */
        if( cvWaitKey( 5 ) == 'q' ) { //jeżeli wciśnięto Q
            std::cout << "Wyjście\n";
            exit( 0 );
           
        }
    }
}
P-43749
DejaVu
» 2011-11-11 13:01:01
NIGDY nie używaj funkcji exit aby zakończyć program.
P-43753
Trix
Temat założony przez niniejszego użytkownika
» 2011-11-11 13:21:12
Ale to czego użyć?
Bo z returnem to samo się dzieje, konsola pozostaje nienaruszona
P-43756
DejaVu
» 2011-11-11 13:25:47
1. Czy testowałeś przykłady z tutoriala?
C/C++
int _tmain( int argc, _TCHAR * argv[] )
{
    IplImage * img = cvLoadImage( "MGC.jpg" );
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvShowImage( "Example1", img );
    cvWaitKey( 0 );
    cvReleaseImage( & img );
    cvDestroyWindow( "Example1" );
    return 0;
}
http://read.pudn.com/downloads133/ebook/565827 /LearningOpenCV_Code/ch2_ex2_8.cpp__.htm
2. Czy przykłady z tutoriala działają poprawnie?
P-43758
Drraven
» 2011-11-11 13:28:32
Piotr mnie wyprzedził :(

Próbowałeś:
throw - 1;
P-43759
Trix
Temat założony przez niniejszego użytkownika
» 2011-11-11 13:44:54
Sprawdziłem te przykłady i one dobrze działają, tak się zastanawiam, a może to jest powodem:

Po skompilowaniu kodu i wciśnięciu f5 (start programu) wyświetla mi się takie coś:

A potem to:


Ale aplikacja działa poprawnie.
P-43760
DejaVu
» 2011-11-11 14:11:35
C/C++
int _tmain( int argc, _TCHAR * argv[] )
{
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
    cvWaitKey( 0 );
    cvDestroyWindow( "Example1" );
    return 0;
}
P-43762
Trix
Temat założony przez niniejszego użytkownika
» 2011-11-11 18:41:15
@UP
Jeśli miałeś na myśli by dodać to: cvDestroyWindow( "View" ); Przed return 0; to niestety muszę zmartwić bo nadal nic się nie zmieniło :|

I co oznaczają te błędy?
P-43790
« 1 » 2
  Strona 1 z 2 Następna strona