#include "StdAfx.h" #include "ImageApplyRotation.h" #ifdef USE_TESSERCAT #define HG_OCR4_BUILD #include "hg_ocr4.h" #endif CImageApplyRotation::CImageApplyRotation(RotationType rotation, bool isBackTransposed, int dpi, const char* tessdataPath) : m_rotation(rotation) , m_backTranspose(isBackTransposed) , m_dpi(dpi) , osd(nullptr) { if (rotation == RotationType::AutoTextOrientation) { #ifdef USE_TESSERCAT osd = new HG_OCR4(); reinterpret_cast(osd)->init(tessdataPath, HG_OCR4::Orientation); #endif } } CImageApplyRotation::~CImageApplyRotation() { #ifdef USE_TESSERCAT if (osd) delete reinterpret_cast(osd); #endif } void CImageApplyRotation::apply(cv::Mat & pDib, int side) { #ifdef LOG FileTools::write_log("imgprc.txt", "enter CImageApplyRotation apply"); #endif // LOG if (pDib.empty()) { #ifdef LOG FileTools::write_log("imgprc.txt", "exit CImageApplyRotation apply"); #endif // LOG return; } if (m_rotation == RotationType::AutoTextOrientation) //�Զ��ı�����ʶ�� { #ifdef USE_TESSERCAT if (osd) { cv::Mat temp; if (m_dpi != 200) { double scale = 200 / static_cast(m_dpi); cv::resize(pDib, temp, cv::Size(), scale, scale); } else temp = pDib.clone(); if (temp.channels() == 3) cv::cvtColor(temp, temp, cv::COLOR_BGR2GRAY); cv::threshold(temp, temp, 180, 255, cv::THRESH_OTSU); HG_OCR4* ptr_osd = reinterpret_cast(osd); int orientation = ptr_osd->getOrientation(temp.data, temp.cols, temp.rows, temp.channels(), temp.step); switch (orientation) { case 1: transpose(pDib, pDib); flip(pDib, pDib, 0); break; case 2: flip(pDib, pDib, 0); flip(pDib, pDib, 1); break; case 3: transpose(pDib, pDib); flip(pDib, pDib, 1); break; default: break; } } #endif } else if (m_backTranspose && side == 1) //������ת180 { if (m_rotation != RotationType::Rotate_180) //��ת180�� { if (m_rotation == RotationType::Rotate_90_clockwise || m_rotation == RotationType::Rotate_90_anti_clockwise) //90�� -90�� { transpose(pDib, pDib); flip(pDib, pDib, m_rotation == RotationType::Rotate_90_clockwise ? 0 : 1); } else { flip(pDib, pDib, 0); flip(pDib, pDib, 1); } } } else //zh { if (m_rotation == RotationType::Rotate_90_clockwise || m_rotation == RotationType::Rotate_90_anti_clockwise) //90�� -90�� { transpose(pDib, pDib); flip(pDib, pDib, m_rotation == RotationType::Rotate_90_clockwise ? 1 : 0); } else if (m_rotation == RotationType::Rotate_180) { flip(pDib, pDib, 0); flip(pDib, pDib, 1); } } #ifdef LOG FileTools::write_log("imgprc.txt", "exit CImageApplyRotation apply"); #endif // LOG } void CImageApplyRotation::apply(std::vector& mats, bool isTwoSide) { if (mats.empty()) return; apply(mats[0], 0); if (isTwoSide && mats.size() > 1) apply(mats[1], 1); }