问题描述
我正在使用 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,则无法解决问题。
如果有人有任何想法,我真的很想知道。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)