最近做图像识别方面的工作,需要对图片中的票据进行提取、识别,票据可能并不是正着放进去的,所以还需要进行旋转,还涉及到一些坐标转换的问题。
这就要用到opencv的轮廓提取、旋转变换等接口知识了。
首先,看看要识别的图片,这里我随便找了一张单据的图片
这里要把图片中的单据提取出来,扶正,并且单据要充满整个图片。(其实还需要识别单据左上方的条形码,并获取其坐标,有点复杂,这里就不说了)
这里说说我的思路:首先,灰度化、二值化,根据亮度的不同,把单据部分的轮廓提取出来,然后填充单据部分,将其作为mask把单据部分拿出来,然后旋转扶正,再次识别,去除边框外的部分,剩下部分生成图片保存。这个过程其实就是这么简单,下面直接上代码:
void GetContoursPic(const char* pSrcFileName, const char* pDstFileName)
{
IplImage* pSrcImg = NULL;
IplImage* pFirstFindImg = NULL;
IplImage* pRoiSrcImg = NULL;
IplImage* pRatationedImg = NULL;
IplImage* pSecondFindImg = NULL;
IplImage* pDstImg = NULL;
CvSeq* pFirstSeq = NULL;
CvSeq* pSecondSeq = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
pSrcImg = cvLoadImage(pSrcFileName, 1);
pFirstFindImg = cvCreateImage(cvGetSize(pSrcImg), IPL_DEPTH_8U, 1);
//检索外围轮廓
cvCvtColor