版权声明:转载请标明出处,谢谢! https://blog.csdn.net/SimileciWH/article/details/85293869
1 datamatrix提取
rotRects中存放的矩形框都是紧贴这图案的,大多数情况下都会损失一些边缘部分,而且不利于精确检测,因此需要适当的扩张边缘的长度,即 extlen 。
我的理解,将缩小一半的图片,四周以extlen的页边距画一个矩形,在这个举行内部的rostRects才能为是要处理的区域,即边界约束,其他不再范围内的区域去除;在范围内的区域边界点在放大为原来的2倍。
dPoints[j].x=dPoints[j].x*2;
dPoints[j].y=dPoints[j].y*2;
乘以2是因为,之前resize原图缩小了2倍,现在放大到原图的大小。
2 cutImg,裁剪图片并且矫正
拍摄到的原始图片,可能是变形或者歪的,(这与粘贴二维码的情况有关系),因此,通过仿射变换将它调整到我们理想的位置。
2.1 opencv的getAffineTransform()
仿射矩阵,是表示一个二维向量 经过线性变换矩阵 和平移变换矩阵 得到矩阵 的一种矩阵,记为仿射矩阵 。
因此,
如上图所示的两张图片之间的仿射。
Mat getAffineTransform( InputArray src, InputArray dst ); //返回仿射矩阵
_warpMat = getAffineTransform(_dmPoints, dstTri); //求得仿射变换矩阵M
warpAffine(_srcImg, _dmImg, _warpMat, Size(60, 60)); //对原图上应用这种仿射变换,输出尺寸为60*60
cvtColor(_dmImg,_dmImg,CV_BGR2GRAY);
2.2 opencv的warpAffine()
代码在2.1节的结尾处。
void warpAffine( InputArray src, //输入要进行仿射变换的图片
OutputArray dst, //输出仿射变换后的图片
InputArray M, //输入getAffineTransform得到的放射变换矩阵
Size dsize, //设置输出仿射变换矩阵的大小
int flags=INTER_LINEAR, //插值算法标识符
int borderMode=BORDER_CONSTANT, //边界像素模式
const Scalar& borderValue=Scalar()); //边界取值,默认值Scalar()为0
flags可选参数 | 含义 |
---|---|
INTER_LINEAR | 双线性差值 (缺省使用) |
INTER_AREA | 区域差值算法,使用象素关系重采样时,图像抽取的首选方法。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 INTER_NEAREST 方法 |
INTER_CUBIC | 立方差值 |
INTER_NEAREST | 最邻近插值算法 |
INTER_LANCZOS4 | Lanczos插值(超过8x8领域的插值算法) |
INTER_MAX | 用于插值的掩模板 |
WARP_INVERSE_MAP | 标志位,反变换 |
WARP_FILL_OUTLIERS | 标志位,用于填充目标图像的像素值,如果其中的一些值对应原图像的异常值,那么这些值讲被设为0 |