Opencv/2DTG,clone() 函数问题

问题描述

我正在使用 opencv 和 2DTG 来读取和分级二维数据矩阵代码。 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,则无法解决问题。

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

image used in the demo code

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...