2

関数 cvCreateTrackbarのコールバック引数に問題があります。これが私が得ているエラーです:

C:\Users\XELTINFO\ProjetVision\moyenetmedian.cpp:28: erreur : argument of type 'void (MoyenEtMedian::)(int)' does not match 'CvTrackbarCallback {aka void (*)(int)}'

クラスのコードは次のとおりです。

int g_switch_value = 0;
int filterInt = 0;
int lastfilterInt = -1;

void MoyenEtMedian::switch_callback(int position)
{
    filterInt = position;
}

void MoyenEtMedian::exec(void)
{
    const char* name = "Filtres";
    IplImage* img = cvLoadImage( "image.png" );
    IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
    cvNamedWindow( name, 1 );
    cvShowImage(name, out);

    // Create trackbar
    cvCreateTrackbar( "Filtre", name, &g_switch_value, 1,switch_callback );

    while( 1 ) {
        switch( filterInt ){
            case 0:
                cvSmooth( img, out, CV_BLUR, 7, 7 );
                break;
            case 1:
                cvSmooth( img, out, CV_MEDIAN, 7, 7 );
                break;
                    }
        if(filterInt != lastfilterInt){
            cvShowImage(name, out);
            lastfilterInt = filterInt;
        }
        if( cvWaitKey( 15 ) == 27 )
            break;
    }

    cvReleaseImage( &img );
    cvReleaseImage( &out );
    cvDestroyWindow( name );
}

スロットを介して実行機能をボタンに接続するつもりです。

4

1 に答える 1

2

定義したコールバック関数 ( void MoyenEtMedian::switch_callback(int position)) は のメンバー関数ですMoyenEtMedian。そのためMoyenEtMedian*、コンパイラによって追加された type の暗黙のメンバーを取得し、 type ではありませんvoid (*)(int)。したがって、このエラー メッセージが表示されます。

この問題を解決するには、メンバー関数switch_callbackを として定義できますstaticが、関数でクラス メンバーを使用することはできません。クラスメンバー関数ではないコールバック関数を定義することもできます。

于 2012-12-09T22:22:06.467 に答える