0

我正在使用 opencv 和 2DTG 来读取和分级 2D 数据矩阵代码。2DTG 是一个专有库,但可以免费使用一个月。

简而言之,我用 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();, 并取消注释这三行

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

我们得到了正确的结果。

我不知道,为什么首先克隆图像会产生问题,因为克隆功能应该是深层副本。更不知道为什么使用静态 int 生成的名称创建文件可以解决问题。请注意,没有静态 int,它不能解决问题。

如果有人有任何想法,我真的很想知道。

演示代码中使用的图像

4

0 回答 0