#pragma once #include #include #include "identify_struct.h" #include "schema_struct.h" #include #include using namespace std; using namespace cv; using namespace cv::ml; using namespace cv::xfeatures2d; using namespace identify::schema; using namespace identify::result; using namespace identify::analysis; namespace identify{ class CResultReader { public: CResultReader(void); ~CResultReader(void); bool m_nBxuanxiang; public: int ReadResult(const IplImage* img, int schemaIndex, cv::Mat transform, double scale, int dir, OMR_RESULT* out_result); int ReadResult(int shemaIndex); void SetSchemaPages(boost::shared_ptrschema); private: //模板 boost::shared_ptrschemaPages; //源图像 const IplImage *src; int m_pageDirection; double m_Scaler0; Mat m_AffineTransform;//防射变换(由模板变换到图像) AnalyseResult anlyseResult; int dianshu_meihaomi; OMR_RESULT* omr_result; std::vector point_muban; std::vector point_shijuan; cv::Ptr knn; private: 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); } //截取图像 int ClipImg(const ISCH_SCHEMA_PAGE& schemaPage); /************************************************************************/ /* 设置识别结果默认值 */ /************************************************************************/ void SetDefaultOMR_Result(OMR_RESULT& omr_result); template T2 warpAffinePoint(T1& src, Mat * map_matrix); template CvRect GetResultRect(T1& item); template CvRect GetJiaoZhengResultRect(T1& item); template T2 GetJiaoZhengResultPoint(T1& point); template void SaveRect(CvRect& rect, T& result); //读取二维码 int ReadBarCode(const ISCH_SCHEMA_PAGE& schemaPage); unsigned char(*_GetGray)(const IplImage * dst, int x, int y); unsigned char GetGray(const IplImage * dst, int x, int y); //获取全局背景灰度,通过统计所有涂点周围像素(灰度不小于160)的灰度平均值获得 int caculate_global_background(const ISCH_SCHEMA_PAGE& schemaPage); //计算涂点属性 int caculate_cell_property(ISCH_SCHEMA_PAGE& schemaPage, ISCH_SCHEMA_ITEM &item, const IplImage * dst, int &cellSize, double &refArea, double &avg_gray, int &grayNum, double &mo_hu_du, double &gao_heidu, int &char_area_size, int& char_area_black_count, double& char_area_avg_gray, int & diheidushu); int caculate_item_property(const ISCH_SCHEMA_PAGE& schemaPage, const ISCH_SCHEMA_ITEM &item, const IplImage * dst, AnalyseResult::itemResult& item_result); void GetCorrectedRect(CvRect &rr, const IplImage * src, int tembackcolor); //分析全局属性 int analyseOmrPanoramic(ISCH_SCHEMA_PAGE& schemaPage); /************************************************************************/ /* 生成OMR涂点字符串(客观题填涂判断) 2014年11月28日10:54:19 */ /************************************************************************/ int GenerateOmrStr(const ISCH_SCHEMA_PAGE& schemaPage); //读取客观题分数 int ReadKeGuanTi(const ISCH_SCHEMA_PAGE &schemaPage); int ReadDingWeiDian(const ISCH_SCHEMA_PAGE& schemaPage); void caculate_item_global_property(const ISCH_SCHEMA_PAGE & schemaPage); int findAssitLocate(const ISCH_SCHEMA_PAGE& schemaPage); //读取填空题,和主观题分数 int ReadQuestionScore(const ISCH_SCHEMA_PAGE &schemaPage); //获取图像指定区域红色点数(主观题) 去除长直线和周边像素 减少直线边缘偏色影响 int GetZhuGuanTiRedCount(IplImage * dst, const CvRect& rect, const CvRect& normal_rect, int * red_counts, int * red_in_counts, int count); //获取图像指定区域红色点数(填空题) int GetTianKongTiRedCount(IplImage * dst, const CvRect& rect_normal, const CvRect& rect_detect); BOOL GetRedBinary(IplImage * dst, const CvRect& rect_detect, IplImage ** red_binary); }; }