Libdecordeqr-0.9.3 解码库阅读

我们通过进入 事例程序,进入入口函数:

../QRDecode/libdecodeqr-0.9.3/src/sample/simple/simpletest.cpp

short stat=qr_decoder_decode_image(decoder,src);

   imagereader->decode(src,adaptive_th_size,adaptive_th_delta); // libdecodeqr.cpp +109

      Qr*ret=this->_decode(adaptive_th_size,adaptive_th_delta);//imagereader.cpp +196

 

_decode() 函数中:

cvSmooth(this->_img_tmp_1c,this->_img_binarized,CV_MEDIAN,3);

 函数 cvSmooth 可使用简单模糊、简单无缩放变换的模糊、中值模糊,高斯模糊、双边滤波的任何一种方法平滑图像。    

解释:

. CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。

. CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1.param2).

. CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积

. CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波(i.e. 邻域是方的).

. CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2

然后经过二值化处理:

cvAdaptiveThreshold()

查找定位:

 this->_find_finder_pattern(); 在_find_finder_pattern 

 

  CvRect ImageReader::_transform_image() // 这个函数看不太懂在干些什么 imagereader.cpp 562

this->qr->set_version((code_matrix->width-17)/4); // 为什么这是减去17 然后除以4 ?

解释:根据图像宽大小,计算出来的, 由原版本公式:(V - 1)* 4 +21 逆推出来的公式。如果是Version 1, 它的长度是21, (21 - 17 )/ 4 = 1

 

if(this->_get_format_info(code_matrix,0)<0){

格式信息包含哪些信息?

格式信息包含,纠错级别信息以及掩码,纠错级别分为 M, L, H, Q 四个等级

     int ret=this->qr->decode_formatinfo(raw_data); // 解码格式信息

 

开始进入解码数据:

int errors=this->qr->decode_codedata();// imagereader.cpp 在 _decode()函数中

   int ret=this->codedata->decode(); // container.cpp 283

        decode() // codedata.cpp 417

           具体在里面进行调用

你可能感兴趣的:(opensource)