diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index dd8bbbdd..28ac6669 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -39,6 +39,7 @@ G200Decode::G200Decode(std::shared_ptr> buff) buffF->resize(f_buffer_size); m_buffs.push_back(buffB); m_buffs.push_back(buffF); + buff.reset(); #else // G200 m_buffs.push_back(buff); #endif @@ -47,13 +48,14 @@ G200Decode::G200Decode(std::shared_ptr> buff) ImageMatQueue::ImageMatQueue(void) : bRun(false) , is_scanning(false) + ,fx(1.001) + ,fy(1.007) { atm_orgin_image_remains = 0; } void ImageMatQueue::run() { - GetFixRatio(fx, fy); if (!m_threadProc) { bRun = true; m_threadProc.reset(new thread(&ImageMatQueue::proc, this)); @@ -65,6 +67,23 @@ int ImageMatQueue::orginimgcount() return atm_orgin_image_remains; } +float ImageMatQueue::getdpi() +{ + return scanParam.resolution_dst; +} + +void ImageMatQueue::updatefixratio(float& hratio, float& vratio) +{ + if (hratio > 0.80f && hratio < 1.2f && vratio >0.80f && vratio < 1.2f) { + fx = hratio; + fy = vratio; + } + else + { + writelog("error horizental or vertical ratio"); + } +} + ImageMatQueue::~ImageMatQueue(void) { m_rawBuffs.Clear(); @@ -80,16 +99,13 @@ ImageMatQueue::~ImageMatQueue(void) void ImageMatQueue::pushMat(std::shared_ptr data) { - //std::lock_guard lock(m_mtxJB); m_rawBuffs.Put(data); atm_orgin_image_remains++; } -std::vector ImageMatQueue::popBmpdata() +std::shared_ptr> ImageMatQueue::popBmpdata() { - //std::lock_guard lock(m_mtxJB); - std::vector retdata = m_imagedata.Take(); - return retdata; + return m_imagedata.Take(); } bool ImageMatQueue::valid() @@ -210,9 +226,12 @@ void ImageMatQueue::setparam(const GScanCap& param) void ImageMatQueue::EnqueueBmpBuffer(std::vector& bmpdata) { //std::lock_guard lock(m_Locker); + //m_imagedata.Put(bmpdata); +} +void ImageMatQueue::EnqueueBmpBuffer(std::shared_ptr> bmpdata) +{ m_imagedata.Put(bmpdata); } - void ImageMatQueue::PaniusCount() { atm_orgin_image_remains--; @@ -251,12 +270,14 @@ void ImageMatQueue::proc() try { cv::Mat mat = cv::imdecode(*buf, rm); + buf.reset(); if (mat.empty()) { writelog("decode image data error"); } #ifdef G200 - resize(mat, mat, cv::Size(), 1.001, 1.007);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 + resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 mats.push_back(mat); + mat.release(); #else // G200 //resize(mat, mat, cv::Size(), 1.001, 1.0070);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动 Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows)); @@ -271,6 +292,7 @@ void ImageMatQueue::proc() writelog(e.what()); } } + buffs.clear(); for (int j = 0; j < m_iaList.size(); j++) { m_iaList[j]->apply(mats, scanParam.is_duplex); @@ -285,6 +307,7 @@ void ImageMatQueue::proc() IMat2Bmp idata; idata = scanParam.pixtype == 0 ? (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst); auto data = idata.getBmpDataBuffer(); + //mats[i].release(); EnqueueBmpBuffer(data); } else @@ -298,6 +321,7 @@ void ImageMatQueue::proc() if (!mats[i].empty()) { ImageMultiOutput m_mlt; Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2); + mats[i].release(); if (!ret.empty()) { if (!scanParam.is_duplex && i == 1) { ret.release(); @@ -305,43 +329,18 @@ void ImageMatQueue::proc() } Mat2Bmp mb(ret, scanParam.resolution_dst); auto data = mb.getBmpDataBuffer(); + ret.release(); EnqueueBmpBuffer(data); } } } } + mats.clear(); PaniusCount(); } } } -void ImageMatQueue::GetFixRatio(double& fixX,double& fixY) -{ - //TCHAR szIniFile[MAX_PATH] = { 0 }; - //SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE); - //_tcscat(szIniFile, HUAGAO_SCAN); - //_tcscat(szIniFile, _T("\\fixed.txt")); - //string path = TCHAR2STRING(szIniFile); - fixX = 1.0010; - fixY = 1.0070; - //if (path.length() > 1) { - // ifstream io(path); - // if (io.is_open()) { - // int linenum = 0; - // string str_line; - // while (!io.eof()) - // { - // getline(io, str_line); - // linenum == 0 ? fixY = stod(str_line) : fixX = stod(str_line); - // } - // } - // else - // { - // writelog("error on getting xy ratio"); - // } - //} -} - GRawDecode::GRawDecode(std::shared_ptr> buff) { m_buffs.push_back(buff); diff --git a/huagao/Device/ImageMatQueue.h b/huagao/Device/ImageMatQueue.h index ec2f0186..daf3a929 100644 --- a/huagao/Device/ImageMatQueue.h +++ b/huagao/Device/ImageMatQueue.h @@ -12,21 +12,47 @@ class IMat2Bmp { public: virtual ~IMat2Bmp() {} - virtual std::vector getBmpDataBuffer() { + virtual std::shared_ptr> getBmpDataBuffer() { return m_data; }; + virtual void setBmpFileHeader(const cv::Mat& mat) {}; + virtual void setBmpInfoHeader(const cv::Mat& mat, const long res) {}; protected: - std::vector m_data; + std::shared_ptr> m_data; }; class Mat2Bmp:public IMat2Bmp { public: Mat2Bmp(const cv::Mat& mat,float res) { + m_data =std::shared_ptr>(new std::vector()); int headersize = mat.channels() == 3 ? 54 : 1078; int bmpdatasize = mat.step1() * mat.rows; - m_data.resize(headersize + bmpdatasize); - cv::imencode(".bmp", mat, m_data); - BITMAPINFOHEADER* infoheader = (BITMAPINFOHEADER*)(m_data.data() + sizeof(BITMAPFILEHEADER)); + m_data->resize(headersize + bmpdatasize); + cv::imencode(".bmp", mat, *(m_data.get())); + setBmpFileHeader(mat); + setBmpInfoHeader(mat, res); + } +private: + void setBmpFileHeader(const cv::Mat& mat) + { + BITMAPFILEHEADER* fileheader = (BITMAPFILEHEADER*)(m_data->data()); + fileheader->bfType = ((unsigned short)('M' << 8) | 'B'); + fileheader->bfSize = m_data.get()->size(); + fileheader->bfReserved1 = 0; + fileheader->bfReserved2 = 0; + fileheader->bfOffBits = mat.channels() == 3 ? 54 : 1078; + } + + void setBmpInfoHeader(const cv::Mat& mat, const long res) + { + BITMAPINFOHEADER* infoheader = (BITMAPINFOHEADER*)(m_data->data() + sizeof(BITMAPFILEHEADER)); + infoheader->biSize = sizeof(BITMAPINFOHEADER); + infoheader->biWidth = mat.cols; + infoheader->biHeight = mat.rows; + infoheader->biPlanes = 1; + infoheader->biBitCount = mat.channels() == 3 ? 24 : 8; + infoheader->biCompression = 0; + infoheader->biSizeImage = (int)((mat.cols * mat.channels() * 8 + 31) / 32) * 4 * mat.rows; infoheader->biXPelsPerMeter = infoheader->biYPelsPerMeter = static_cast(res * 39.37F + 0.5); infoheader->biClrUsed = infoheader->biClrImportant = infoheader->biBitCount == 8 ? 256 : 0; } @@ -35,18 +61,18 @@ public: class Mat2BmpBw :public IMat2Bmp { public: Mat2BmpBw(const cv::Mat& mat,float res) { - //cv::imwrite("bw.bmp", mat); + m_data = std::shared_ptr>(new std::vector()); int headsize = 62; int width = mat.cols; int height = mat.rows; int bmpdatasize = (width + 31) / 32 * 4*height; - m_data.resize(headsize + bmpdatasize); - unsigned char* binary = m_data.data()+62;//file header(14)+info header(40)+RGBQUAD(8) + m_data->resize(headsize + bmpdatasize); + unsigned char* binary = m_data->data()+62;//file header(14)+info header(40)+RGBQUAD(8) setBmpFileHeader(mat,bmpdatasize); setBmpInfoHeader(mat, bmpdatasize, res); - memcpy(m_data.data(), &m_fileHeader, sizeof(BITMAPFILEHEADER)); - memcpy(m_data.data() + sizeof(BITMAPFILEHEADER), &m_infoHeader, sizeof(BITMAPINFOHEADER)); - RGBQUAD* quad = (RGBQUAD*)(m_data.data() + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)); + memcpy(m_data->data(), &m_fileHeader, sizeof(BITMAPFILEHEADER)); + memcpy(m_data->data() + sizeof(BITMAPFILEHEADER), &m_infoHeader, sizeof(BITMAPINFOHEADER)); + RGBQUAD* quad = (RGBQUAD*)(m_data->data() + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)); quad->rgbBlue = quad->rgbGreen = quad->rgbRed = quad->rgbReserved = 0; quad++; quad->rgbBlue = quad->rgbGreen = quad->rgbRed = 255; @@ -83,7 +109,7 @@ private: m_fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + nDIBSize; } - void setBmpInfoHeader(const cv::Mat& mat,const int bmpDataLen, const long res) { + void setBmpInfoHeader(const cv::Mat& mat,const int bmpDataLen, const long res){ memset(&m_infoHeader, 0, sizeof(BITMAPINFOHEADER)); m_infoHeader.biSize = sizeof(BITMAPINFOHEADER); m_infoHeader.biWidth = mat.cols; @@ -93,8 +119,7 @@ private: m_infoHeader.biCompression = 0; m_infoHeader.biSizeImage = bmpDataLen; m_infoHeader.biXPelsPerMeter = m_infoHeader.biYPelsPerMeter = static_cast(res * 39.37F + 0.5); - m_infoHeader.biClrUsed = 2; - m_infoHeader.biClrImportant = 2; + m_infoHeader.biClrUsed = m_infoHeader.biClrImportant = 2; } private: @@ -129,7 +154,7 @@ public: virtual ~ImageMatQueue(void); void pushMat(std::shared_ptr buf); - std::vector popBmpdata(); + std::shared_ptr> popBmpdata(); bool empty(); bool valid(); void clear(); @@ -137,16 +162,14 @@ public: void run(); int orginimgcount(); void setscanflags(const bool flags) { is_scanning = flags; } - + float getdpi(); + void updatefixratio(float& hratio, float& vratio); private: void proc(); - void GetFixRatio(double& fixX, double& fixY); void EnqueueBmpBuffer(std::vector& bmpdata); + void EnqueueBmpBuffer(std::shared_ptr>); void PaniusCount(); - BlockingQueue> m_imagedata; - std::mutex m_Locker; - std::mutex m_mtxJB; - std::mutex m_mtxscan; + BlockingQueue>>m_imagedata; std::unique_ptr m_threadProc; volatile bool bRun; volatile int atm_orgin_image_remains; @@ -155,5 +178,5 @@ private: Device::PaperSize papersize; std::vector> m_iaList; BlockingQueue> m_rawBuffs; - double fx, fy; + float fx, fy; }; \ No newline at end of file