我们通过进入 事例程序,进入入口函数:
../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
具体在里面进行调用