/* * ==================================================== * 功能:Mark点定位裁剪。识别试卷中的mark点,进行纠偏裁剪。该功能不能完全独立使用,因为可能会识别失败,然后需要继续用传统裁剪纠偏进行补充。 * 作者:刘丁维 * 生成时间:2020/5/22 * 最近修改时间:2020/5/22 v1.0 2020/7/29 v1.1 优化Mark点识别,以及文稿方向判定 2020/7/30 v1.1.1 优化Mark点识别,以及文稿方向判定 2020/8/3 v1.2 针对七天,添加三Mark点识别文稿方向,原来的方式定义为多边识别文稿方向 2020/8/12 v1.3 针对七天,添加了条码判断算法,用于判定试卷是否为指定试卷。该条码只是粗略识别是否是条码,而不进行准确识别。 apply接口增加barCode参数,用于是否开启粗判断条码功能 2020/8/12 v1.4 针对七天,添加裁剪接口,可进行裁剪与不裁剪两种选择 * 版本号:v1.4 * ==================================================== */ #ifndef IMAGEMARKCROPAPPLY_H #define IMAGEMARKCROPAPPLY_H #include "ImageApply.h" class GIMGPROC_LIBRARY_API CImageApplyMarkCrop { public: //识别文稿方向方式 enum DirectionMethod { Trilateral_7Net, //三边定位文稿方向(针对七天需求) Multilateral //多边定位文稿方向 }; enum DPI : ushort { DPI_200 = 200, DPI_300 = 300 }; enum DeviceModel { G400 = 2, G300 = 3 }; enum Orientation { Default = 0, Left_RT, //多边文稿方向识别时靠左为正;7天3mark识别时,缺角在右上为正 Top_RB, //多边文稿方向识别时靠上为正;7天3mark识别时,缺角在右下为正 Right_LB, //多边文稿方向识别时靠右为正;7天3mark识别时,缺角在左下为正 Bottom_LT //多边文稿方向识别时靠下为正;7天3mark识别时,缺角在左上为正 }; public: CImageApplyMarkCrop(DeviceModel device, bool isCropped = true, double threshold = 20, int noise = 40, DPI dpi = DPI::DPI_200, DirectionMethod direction = DirectionMethod::Multilateral); /* * src [in]: 原图 * dst [out]:处理成功时,返回的结果图像 * markOri [in]: 文稿方向判定方式 * barCode [in]: 是否判断条形码,该功能只针对Trilateral_7Net模式 * angle [out]:返回文稿方向偏转角度。有0、90、180、270四种情况 * 返回值: 0:成功; -1:原图为空,或者无法找到图片轮廓(纯黑图会报该错误); -2:mark小于3个 -3:选择Multilateral模式时,mark点小于4个 -4:识别条形码时,目标图像过小,无法包含条形码 -5:无条形码 */ int apply(const cv::Mat& src, cv::Mat& dst, Orientation markOri, bool barCode, int& angle); inline DeviceModel getDeviceModel() { return m_device; } inline void setDeviceModel(DeviceModel device) { m_device = device; } inline bool isCropped() { return m_b_isCropped; } inline void setCropped(bool cropped) { m_b_isCropped = cropped; } inline double getThreshold() { return m_threshold; } inline void setThreshold(double threshold) { m_threshold = threshold; } inline int getNoise() { return m_noise; } inline void setNoise(int noise) { m_noise = noise; } inline DPI getDPI() { return m_dpi; } inline void setDPI(DPI dpi) { m_dpi = dpi; } inline const cv::Range getSizeRange() { return m_range; } inline void setSizeRange(const cv::Range& range) { m_range = range; } inline void setSizeRange(int low, int up) { m_range = cv::Range(low, up); } private: void findMarks(const std::vector>& contours, const cv::RotatedRect& region, const cv::Range& range, std::vector>& marks, std::vector& rrect); bool isContainBarCode(const cv::Mat& image); private: DeviceModel m_device; bool m_b_isCropped; double m_threshold; int m_noise; DPI m_dpi; cv::Range m_range; DirectionMethod m_direction; }; #endif // IMAGEMARKCROPAPPLY_H