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 がないと、問題は解決しないことに注意してください。
誰かが何か考えを持っているなら、私は本当に知りたい.