Util.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #pragma once
  2. #include <string>
  3. #include "schema_struct.h"
  4. #include "schema_struct_auto.h"
  5. void SetTBLR(identify::autoschema::ASCH_SchemaQuestionScore& score);
  6. /************************************************************************/
  7. /* 按x坐标升序排序 2014年11月28日10:50:56 */
  8. /************************************************************************/
  9. bool sortx(const CvContour * c1,const CvContour * c2);
  10. /************************************************************************/
  11. /* 按y坐标升序排序 2014年11月28日10:51:22 */
  12. /************************************************************************/
  13. bool sorty(const CvContour * c1,const CvContour * c2);
  14. /************************************************************************/
  15. /*解析条码图像 */
  16. /************************************************************************/
  17. int PraseQRCode(IplImage* img ,std::string & resultString);
  18. /************************************************************************/
  19. /*计算两个点所组成的执行与x轴的夹角 */
  20. /************************************************************************/
  21. double degree(const int& x1,const int& y1,const int& x2,const int& y2);
  22. /************************************************************************/
  23. /* 获取区域黑色点数量 */
  24. /************************************************************************/
  25. int GetBlackArea( const IplImage * dst ,int valve =180);
  26. /************************************************************************/
  27. /* rgb模型(颜色空间)转换为hsv模型(颜色空间) */
  28. /************************************************************************/
  29. void rgb2hsv(const int& r,const int& g,const int& b,float& h,float& s,float& v);
  30. /************************************************************************/
  31. /* 从灰度图像中获取灰度值 2014年11月28日20:10:57 */
  32. /************************************************************************/
  33. int GetGrayValue( const IplImage * dst, int x, int y );
  34. /************************************************************************/
  35. /* 从RGB图像中获取灰度值 2014年11月28日20:11:13 */
  36. /************************************************************************/
  37. int GetBGRGray( const IplImage * dst, int x, int y );
  38. /************************************************************************/
  39. /* 切割图像 2014年11月28日20:11:13 */
  40. /************************************************************************/
  41. IplImage* CutImage( IplImage* img,CvRect rect);
  42. /************************************************************************/
  43. /* 斜切图像 2014年11月28日20:11:13 */
  44. /************************************************************************/
  45. IplImage* CutRotateImage(const IplImage* img,CvPoint center,CvSize size,float degree);
  46. void split(std::string& s, std::string& delim,std::vector< std::string >* ret);
  47. //排序CvRect
  48. bool sort_locate_point_by_x( const CvRect c1,const CvRect c2 );
  49. bool sort_locate_point_by_y( const CvRect c1,const CvRect c2 );
  50. //计算两个点组成的三角函数值和距离
  51. template<class Point> inline void caculate_sc(const Point &p2,const Point &p1, double &sina, double &cosa ,double& d){
  52. double dy =p2.y-p1.y;
  53. double dx =p2.x-p1.x;
  54. d = sqrt(dx*dx+dy*dy);
  55. sina=dy/d;
  56. cosa=dx/d;
  57. }
  58. /***********************计算仿射变换矩阵,并旋转图像*********************************/
  59. /************************************************************************/
  60. /*校正图像 http://blog.csdn.net/xiaowei_cqu/article/details/7616044 */
  61. /************************************************************************/
  62. template<class Point> void JiaoZheng(const IplImage * src,IplImage * dst,Point p_dst1,Point p_dst2,Point p_src1,Point p_src2){
  63. double sin_dst ;double cos_dst;
  64. double sin_src ;double cos_src;
  65. double da,db;
  66. caculate_sc(p_src2, p_src1, sin_src, cos_src,db);
  67. caculate_sc(p_dst2, p_dst1, sin_dst, cos_dst,da);
  68. double sina_b=-sin_dst*cos_src+cos_dst*sin_src;
  69. double cosa_b=cos_dst*cos_src+sin_dst*sin_src;
  70. double scale = da/db;
  71. float degree = 90;
  72. double offsetx = p_dst1.x-(cosa_b*scale*p_src1.x+sina_b*scale*p_src1.y);
  73. double offsety = p_dst1.y-(-sina_b*scale*p_src1.x+cosa_b*scale*p_src1.y);
  74. float m1[6]={cosa_b*scale,sina_b*scale,offsetx,-sina_b*scale,cosa_b*scale,offsety};
  75. CvMat M = cvMat(2, 3, CV_32F, m1);
  76. cvWarpAffine( src, dst, &M,CV_INTER_LINEAR,cvScalarAll(255) );
  77. }
  78. //计算旋转矩阵
  79. template<class Point> CvMat* caculate_scm(const Point &p_dst1,const Point & p_dst2,const Point & p_src1,const Point & p_src2){
  80. double sin_dst ;double cos_dst;
  81. double sin_src ;double cos_src;
  82. double da,db;
  83. caculate_sc(p_src2, p_src1, sin_src, cos_src,db);
  84. caculate_sc(p_dst2, p_dst1, sin_dst, cos_dst,da);
  85. double sina_b=-sin_dst*cos_src+cos_dst*sin_src;
  86. double cosa_b=cos_dst*cos_src+sin_dst*sin_src;
  87. double scale = da/db;
  88. float degree = 90;
  89. double offsetx = p_dst1.x-(cosa_b*scale*p_src1.x+sina_b*scale*p_src1.y);
  90. double offsety = p_dst1.y-(-sina_b*scale*p_src1.x+cosa_b*scale*p_src1.y);
  91. float m1[6]={cosa_b*scale,sina_b*scale,offsetx,-sina_b*scale,cosa_b*scale,offsety};
  92. CvMat* m=cvCreateMat(2, 3, CV_32F);
  93. memcpy(m->data.fl,m1,sizeof(float)*6);
  94. return m;
  95. }
  96. int PraseQRCode_Normal( IplImage* img ,std::string & resultString );
  97. int PraseBarCode_Normal( IplImage* img ,std::string & resultString );
  98. int PraseBarCode( IplImage* img ,std::string & resultString );
  99. //从灰度图像中获取灰度值
  100. #define GET_GRAY_VALUE_BY_FIRST(first,x) (first[x]&&0xff)
  101. #define GET_GRAY_VALUE(img,x,y) GET_GRAY_VALUE_BY_FIRST(&img->imageData[img->widthStep*y],x)
  102. //从RBG图像中获取灰度值
  103. #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)
  104. #define GET_GRAY_VALUE_BY_RBG(img,x,y) GET_GRAY_VALUE_BY_RBG_FIRST(&img->imageData[img->widthStep*y],x)
  105. template<typename T1,typename T2> T2 warpAffinePoint(T1& src,Mat * map_matrix){
  106. T2 r;
  107. r.x = map_matrix->at<double>(0,0)*src.x+map_matrix->at<double>(0,1)*src.y+map_matrix->at<double>(0,2);
  108. r.y = map_matrix->at<double>(1,0)*src.x+map_matrix->at<double>(1,1)*src.y+map_matrix->at<double>(1,2);
  109. return r;
  110. }
  111. template<typename T1,typename T2 >
  112. double GetDistance( T1 point1, T2 point2 )
  113. {
  114. double dx = point1.x-point2.x;
  115. double dy = point1.y-point2.y;
  116. return sqrt(dx*dx+dy*dy);
  117. }