#pragma once #include #include "schema_struct.h" #include "schema_struct_auto.h" void SetTBLR(identify::autoschema::ASCH_SchemaQuestionScore& score); /************************************************************************/ /* 按x坐标升序排序 2014年11月28日10:50:56 */ /************************************************************************/ bool sortx(const CvContour * c1,const CvContour * c2); /************************************************************************/ /* 按y坐标升序排序 2014年11月28日10:51:22 */ /************************************************************************/ bool sorty(const CvContour * c1,const CvContour * c2); /************************************************************************/ /*解析条码图像 */ /************************************************************************/ int PraseQRCode(IplImage* img ,std::string & resultString); /************************************************************************/ /*计算两个点所组成的执行与x轴的夹角 */ /************************************************************************/ double degree(const int& x1,const int& y1,const int& x2,const int& y2); /************************************************************************/ /* 获取区域黑色点数量 */ /************************************************************************/ int GetBlackArea( const IplImage * dst ,int valve =180); /************************************************************************/ /* rgb模型(颜色空间)转换为hsv模型(颜色空间) */ /************************************************************************/ void rgb2hsv(const int& r,const int& g,const int& b,float& h,float& s,float& v); /************************************************************************/ /* 从灰度图像中获取灰度值 2014年11月28日20:10:57 */ /************************************************************************/ int GetGrayValue( const IplImage * dst, int x, int y ); /************************************************************************/ /* 从RGB图像中获取灰度值 2014年11月28日20:11:13 */ /************************************************************************/ int GetBGRGray( const IplImage * dst, int x, int y ); /************************************************************************/ /* 切割图像 2014年11月28日20:11:13 */ /************************************************************************/ IplImage* CutImage( IplImage* img,CvRect rect); /************************************************************************/ /* 斜切图像 2014年11月28日20:11:13 */ /************************************************************************/ IplImage* CutRotateImage(const IplImage* img,CvPoint center,CvSize size,float degree); void split(std::string& s, std::string& delim,std::vector< std::string >* ret); //排序CvRect bool sort_locate_point_by_x( const CvRect c1,const CvRect c2 ); bool sort_locate_point_by_y( const CvRect c1,const CvRect c2 ); //计算两个点组成的三角函数值和距离 template inline void caculate_sc(const Point &p2,const Point &p1, double &sina, double &cosa ,double& d){ double dy =p2.y-p1.y; double dx =p2.x-p1.x; d = sqrt(dx*dx+dy*dy); sina=dy/d; cosa=dx/d; } /***********************计算仿射变换矩阵,并旋转图像*********************************/ /************************************************************************/ /*校正图像 http://blog.csdn.net/xiaowei_cqu/article/details/7616044 */ /************************************************************************/ template void JiaoZheng(const IplImage * src,IplImage * dst,Point p_dst1,Point p_dst2,Point p_src1,Point p_src2){ double sin_dst ;double cos_dst; double sin_src ;double cos_src; double da,db; caculate_sc(p_src2, p_src1, sin_src, cos_src,db); caculate_sc(p_dst2, p_dst1, sin_dst, cos_dst,da); double sina_b=-sin_dst*cos_src+cos_dst*sin_src; double cosa_b=cos_dst*cos_src+sin_dst*sin_src; double scale = da/db; float degree = 90; double offsetx = p_dst1.x-(cosa_b*scale*p_src1.x+sina_b*scale*p_src1.y); double offsety = p_dst1.y-(-sina_b*scale*p_src1.x+cosa_b*scale*p_src1.y); float m1[6]={cosa_b*scale,sina_b*scale,offsetx,-sina_b*scale,cosa_b*scale,offsety}; CvMat M = cvMat(2, 3, CV_32F, m1); cvWarpAffine( src, dst, &M,CV_INTER_LINEAR,cvScalarAll(255) ); } //计算旋转矩阵 template CvMat* caculate_scm(const Point &p_dst1,const Point & p_dst2,const Point & p_src1,const Point & p_src2){ double sin_dst ;double cos_dst; double sin_src ;double cos_src; double da,db; caculate_sc(p_src2, p_src1, sin_src, cos_src,db); caculate_sc(p_dst2, p_dst1, sin_dst, cos_dst,da); double sina_b=-sin_dst*cos_src+cos_dst*sin_src; double cosa_b=cos_dst*cos_src+sin_dst*sin_src; double scale = da/db; float degree = 90; double offsetx = p_dst1.x-(cosa_b*scale*p_src1.x+sina_b*scale*p_src1.y); double offsety = p_dst1.y-(-sina_b*scale*p_src1.x+cosa_b*scale*p_src1.y); float m1[6]={cosa_b*scale,sina_b*scale,offsetx,-sina_b*scale,cosa_b*scale,offsety}; CvMat* m=cvCreateMat(2, 3, CV_32F); memcpy(m->data.fl,m1,sizeof(float)*6); return m; } int PraseQRCode_Normal( IplImage* img ,std::string & resultString ); int PraseBarCode_Normal( IplImage* img ,std::string & resultString ); int PraseBarCode( IplImage* img ,std::string & resultString ); //从灰度图像中获取灰度值 #define GET_GRAY_VALUE_BY_FIRST(first,x) (first[x]&&0xff) #define GET_GRAY_VALUE(img,x,y) GET_GRAY_VALUE_BY_FIRST(&img->imageData[img->widthStep*y],x) //从RBG图像中获取灰度值 #define GET_GRAY_VALUE_BY_RBG_FIRST(first,x) (((0xff& first[x*3])*15+(0xff&first[x*3+1])*75+(0xff&first[x*3+2])*38)>>7) #define GET_GRAY_VALUE_BY_RBG(img,x,y) GET_GRAY_VALUE_BY_RBG_FIRST(&img->imageData[img->widthStep*y],x) template T2 warpAffinePoint(T1& src,Mat * map_matrix){ T2 r; r.x = map_matrix->at(0,0)*src.x+map_matrix->at(0,1)*src.y+map_matrix->at(0,2); r.y = map_matrix->at(1,0)*src.x+map_matrix->at(1,1)*src.y+map_matrix->at(1,2); return r; } template double GetDistance( T1 point1, T2 point2 ) { double dx = point1.x-point2.x; double dy = point1.y-point2.y; return sqrt(dx*dx+dy*dy); }