0

opencv と 2DTG を使用して、2D データ マトリックス コードの読み取りと評価を行っています。2DTG は独自のライブラリですが、1 か月間は無料で使用できます。

つまり、opencv で画像を開き、そのピクセル値を 2dtg 画像にコピーしてから、コードを読み取り、そのグレードを抽出します。これを行うと、結果として与えられた一連の成績が得られます。ただし、ピクセルを 2dtg イメージにコピーする前に cv::Mat のクローンを作成すると、得られるグレードのセットが異なります。ただし、ピクセルをコピーする前にファイルを作成すると、元の結果が返されます。

int Grade_DM_V0(Mat &image){

    int rowcount = image.rows, colcount = image.cols, retour = 1;
    TRow*   pbits;
    TRow    pmembits;  // Image in Memory
    PDM_Decoder pDecoder;
    PDM_Options dec1;
    TDM_OptMode opt;
    TDM_ImageInfo* pdm_imageinfo;
    TDM_Info* pdm_info;

    pmembits = (TRow) malloc(rowcount*colcount);       //  Image in Memory
    pbits    = (TRow*) malloc(rowcount*sizeof(TRow)); // pointers to ScanLines
    for (int row = 0; row < rowcount; row++){pbits[row] = &pmembits[colcount*row];}

    pDecoder = Connect_DM_Decoder(rowcount, colcount);

    opt.maxDMCount = 1;
    opt.speedMode  = DMSP_ULTIMATEPLUS;
    opt.qualityMask = DM_QM_ALL; // Grade all channels
    opt.labelMode  =  LM_STANDARD;
    opt.timeOut    = 0;

    dec1 = Create_DM_Options(pDecoder,opt);

    Mat img_copy = image.clone();
    if (image.channels() == 3) cvtColor(image, img_copy, cv::COLOR_BGR2GRAY);
    else img_copy = image.clone();

    /*static int cpt = 1;
    string out_name = "./fichier_image_fail" + to_string(cpt++) + ".txt";
    ofstream fichier(out_name);*/

    for (int y = 0; y < rowcount; y++){
        for (int x = 0; x < colcount; x++){
            pbits[y][x] = image.at<unsigned char>(y,x);
        }
    }

    DecodeDM_Bits(dec1, rowcount, colcount, pbits);
    pdm_imageinfo = GetDM_ImageInfo(dec1);


    if((pdm_imageinfo->DMCount > 0) && (pdm_imageinfo->RejectionReason == DM_RR_OK)){
        //Extract the list of grades
        pdm_info = GetDM_Info(dec1, 0);
        cout << (int)(pdm_info->quality.overall_grade) << endl;
        cout << (int)(pdm_info->quality.symbol_contrast_grade) << endl;
        cout << (int)(pdm_info->quality.axial_nonuniformity_grade) << endl;
        cout << (int)(pdm_info->quality.grid_nonuniformity_grade) << endl;
        cout << (int)(pdm_info->quality.unused_error_correction_grade) << endl;
        cout << (int)(pdm_info->quality.modulation_grade) << endl;
        cout << (int)(pdm_info->quality.fixed_pattern_damage_grade) << endl;
    }
    else{retour = -1;}
    //Clean the memory
    Delete_DM_Options(dec1);  // not necessary
    Disconnect_DM_Decoder(pDecoder);
    free(pbits);
    free(pmembits);
    return retour;

}

void test_grading(){

    string curr_path = "1.png";
    Mat image = imread(curr_path, 0);
    //Mat Icopy = image.clone();
    Grade_DM_V0(image);
}

ここにコピーしたコードを呼び出すと、適切な結果が得られます。

のコメントを外すとMat Icopy = image.clone();、間違った結果が得られます。

のコメントMat Icopy = image.clone();を外して else をコメントアウトするとimg_copy = image.clone();、適切な結果が得られます。

のコメントMat Icopy = image.clone();を外し、3 行のコメントを外します。

static int cpt = 1;
string out_name = "./fichier_image_fail" + to_string(cpt++) + ".txt";
ofstream fichier(out_name);

適切な結果が得られます。

クローン機能はディープコピーであると想定されているため、イメージのクローンを作成すると最初に問題が発生する理由がわかりません。static int で生成された名前を使用してファイルを作成すると、問題が解決する理由はさらにわかりません。static int がないと、問題は解決しないことに注意してください。

誰かが何か考えを持っているなら、私は本当に知りたい.

デモコードで使用される画像

4

0 に答える 0