簡體   English   中英

C ++程序無法區分OpenCV應用程序中的大小寫字母

[英]C++ program not distinguishing between upper and lower case letters in OpenCV application

我正在編輯一些同事編寫的相對較大的基於OpenCV的程序。 我面臨的問題是該程序無法區分大寫和小寫按鍵(即,按鍵“ d”和“ D”都視為0x65)。我的同事告訴我,他通過編譯鍵盤來解決了該問題。他機器上的OpenCV庫直接來自源代碼。

我是一個新手,但也很好奇為什么會發生這種情況以及它與OpenCV安裝有何關系!

我的機器上仍然有問題,但是我沒有嘗試重新安裝openCV。

編輯:OS Linux-Ubuntu 12.10 64bit字母是來自鍵盤的擊鍵,它們在switch語句中使用。

    static int process_key(struct cam_segment* cs, int key){
    int res = 0;
    double pdist;
    struct stat sb;
    char fn[4096];
    static int out_id = 0;
    fprintf( stderr, "%d\n", key&0xff );
    switch (key & 0xff) {
    case 'm':
        show_merged = !show_merged;
        res = 1;
        break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
        cam_id = (key & 0xff) - '1';
        res = 1;
        break;
    case 'D':
        ocv_mgrid_set_distortion( cs->mg, 0 );
        res = 1;
        break;
    case 'd':
        ocv_mgrid_set_distortion( cs->mg, 1 );
        res = 1;
        break;
    case 'n':
        res = 1;
        break;
    case 'C':
        init_calibration(cs);
        calibrate_camera_distortion(cs->mg);
        output_calibration_results(cs);
        cs->calib_mode = 1;
        res = 1;

        break;
    case 'c':
        init_calibration(cs);
        fprintf(stderr,"searching.....");
        calibrate_camera_rotation(cs->mg);
        output_calibration_results(cs);
        fprintf(stderr,"e1 %f\n",water_error(cs->mg));
        cs->calib_mode = 1;
        res = 1;
        break;
    case 'M':
        init_calibration(cs);
        fprintf(stderr,"searching pricipal point.....");
        calibrate_camera_center(cs->mg);
        output_calibration_results(cs);
        cs->calib_mode = 1;
        res = 1;
        break;
    case 'a':
        init_calibration(cs);
        int misscnt;
        double e,en;
        en = e = HUGE;
        misscnt = 0;
        for(int i=0;i<20;i++) {
            e = water_error(cs->mg);
            fprintf(stderr,"e1 %f %d \n",e,misscnt);
            calibrate_camera_rotation(cs->mg);
            output_calibration_results(cs);
            en = water_error(cs->mg);
            fprintf(stderr,"en1 %f\n",en);
            if (en >= e)
                misscnt++;
            else
                misscnt = 0;
            if (misscnt > 3)
                break;
            e = water_error(cs->mg);
            fprintf(stderr,"e %f %d\n",e,misscnt);
            calibrate_coupled_focal_length(cs->mg);
            output_calibration_results(cs);
            en = water_error(cs->mg);
            fprintf(stderr,"en %f\n",en);
            if (en >= e)
                misscnt++;
            else
                misscnt = 0;
            if (misscnt > 3)
                break;
            e = water_error(cs->mg);
            if (e > 100) 
                continue;
            fprintf(stderr,"e %f %d\n",e,misscnt);
            calibrate_camera_distortion(cs->mg);
            output_calibration_results(cs);
            en = water_error(cs->mg);
            fprintf(stderr,"en %f\n",en);
            if (en >= e)
                misscnt++;
            else
                misscnt = 0;
            if (misscnt > 3)
                break;
        }
        cs->calib_mode = 1;
        res = 1;
        break;
    case 'p':
        init_calibration(cs);
        calibrate_coupled_focal_length(cs->mg);
        output_calibration_results(cs);
        cs->calib_mode = 1;
        res = 1;
        break;
    case 'F':
        init_calibration(cs);
        calibrate_focal_lengths(cs->mg);
        output_calibration_results(cs);
        cs->calib_mode = 1;
        res = 1;
        break;
    case 't':
        init_calibration(cs);
        calibrate_target(cs->mg);
        output_calibration_results(cs);
        cs->calib_mode = 1;
        res = 1;
        break;
    case 'e':
        sprintf(fn, "%s_%03d.png",cs->inp_prefix, cs->inp_id);
        if (!(input = cvLoadImage(fn, CV_LOAD_IMAGE_COLOR))) {
            fprintf(stderr,"error calc: loading input failed\n");
        } else if (!(ocv_mgrid_set_input(cs->mg, input))) {
            fprintf(stderr,"error calc error 1\n");
        }
        pdist = water_error(cs->mg);
        fprintf(stderr,"watererror: %f\n",pdist);
        break;
    case 'N':
        res = 1;
        cs->inp_id++;
        cerr << "inp_id=" << cs->inp_id << "\n";
        break;
    case 'P':
        res = 1;
        cs->inp_id--;
        cerr << "inp_id=" << cs->inp_id << "\n";
        break;

    case 'z':
        cs->color_mode = OCV_MGRID_CMODE_THETA;
        res = 1;
        break;
    case 'Z':
        cs->color_mode = OCV_MGRID_CMODE_THETA_CHECK;
        res = 1;
        break;
    case 'l':
        cs->draw_legend = !(cs->draw_legend);
        res = 1;
        break;
    case 'x':
        cs->color_mode = OCV_MGRID_CMODE_X;
        res = 1;
        break;
    case 'y':
        cs->color_mode = OCV_MGRID_CMODE_Y;
        res = 1;
        break;
    case 'X':
        cs->color_mode = OCV_MGRID_CMODE_X_CHECK;
        res = 1;
        break;
    case 'Y':
        cs->color_mode = OCV_MGRID_CMODE_Y_CHECK;
        res = 1;
        break;
    case 'o':
        cs->color_mode = OCV_MGRID_CMODE_NONE;
        res = 1;
        break;
    case 's':

        sprintf(fn, "input_%03d.png",out_id);
        while(stat(fn, &sb) != -1) {
            out_id++;
            sprintf(fn, "input_%03d.png",out_id);
        }
        fprintf(stderr,"saving %s \n",fn);
        cvSaveImage(fn,OCV_MGRID_GET_INPUT(cs->mg));
        break;
    case 'r':
        if (projection)
            cvResetImageROI(projection);
        if (merged_projection)
            cvResetImageROI(merged_projection);
        if (merged_grid)
            cvResetImageROI(merged_grid);
        if (output)
            cvResetImageROI(output);
        break;
    case 'R':
        reset_defaults();
        reset_trackbars();
        break;
    case 'f':
        ocv_mgrid_get_best_projection_distance(cs->mg, &pdist);
        fprintf(stderr,"best match %f\n",pdist);
        tb_pdist = (int) pdist;
        cvSetTrackbarPos("proj_distance", "tbars", tb_pdist);
        res = 1;
        break;
    case 'w':
        if (use_camera)
            if (!(ocv_ueye_whitebalance(cs->ueye)))
                return 1;
        break;
    case 'W':
        save_params(cs);
        break;
    default:
        break;
    }
    return res;
}

我不知道為什么直到現在! 但是我已經刪除了舊的OpenCV庫並編譯了最新版本。 現在,它可以區分大小寫字母了。

新版本具有一些不一定很好的細微差別,例如軌跡欄的值無法再通過單擊它們進行編輯。 另外(@ kebs),現在必須使用0xff遮蓋按鍵!

我不知道也許我一直都有一個怪異的OpenCV版本!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM