huago-corrcet_tools/HuaGoCorrect/ImageMatQueue.cpp

263 lines
5.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "ImageMatQueue.h"
#include "PublicFunc.h"
#include "filetools.h"
#include "imageprocess.h"
#include <atlconv.h>
#include <queue>
//using namespace std::this_thread;
using namespace std;
ImageMatQueue::ImageMatQueue(void) :b_save_origin(false),
b_save_fixed_origin(false)
{
pixType=-1;
DevModel=-1;
if(!bRun)
{
m_threadProc = std::thread(&ImageMatQueue::proc, this);
bRun = true;
}
}
void ImageMatQueue::run()
{
if(m_threadProc.joinable())
{
bRun = false;
m_threadProc.join();
}
bRun = true;
m_threadProc = std::thread(&ImageMatQueue::proc, this);
}
void ImageMatQueue::setmultioutputR(bool canoutput/*=false*/)
{
can_multi_outputR=canoutput;
}
void ImageMatQueue::SetDevModel(int dev/*=-1*/)
{
DevModel=dev;
}
ImageMatQueue::~ImageMatQueue(void)
{
if (m_threadProc.joinable())
{
bRun = false;
m_threadProc.join();
XdPrint("m_threadProc Released True 111111111111111111111111111\n");
}
if (m_images.Size() > 0)
{
m_images.Clear();
m_images.ShutDown();
}
if (m_pImages.Size() > 0)
{
m_pImages.Clear();
m_pImages.ShutDown();
}
}
void ImageMatQueue::pushMat(JpegBuffer& data)
{
m_pImages.Put(data);
int k = 0;
}
void ImageMatQueue::UpdateSaveConfig(bool saveOrigin, bool saveFixedOrigin)
{
b_save_origin= saveOrigin;
b_save_fixed_origin=saveFixedOrigin ;
}
cv::Mat ImageMatQueue::popMat(int num)
{
return _popMat(num);
}
cv::Mat ImageMatQueue::popMat()
{
return m_images.Take();
}
bool ImageMatQueue::valid()
{
bool bIsEmpty = m_images.Size()==0;
return !bIsEmpty;
}
void ImageMatQueue::clear()
{
m_images.Clear();
m_pImages.Clear();
}
cv::Mat ImageMatQueue::_popMat(int num)
{
std::queue<cv::Mat> m_Tempimages; // ÁÙʱ¶ÓÁÐ
cv::Mat Tempimage;
cv::Mat image;
int i = 0;
int iSize = m_images.Size();
for(i = 0;i < iSize;i++)
{
image = m_images.Front();
m_Tempimages.push(image);
image.release();
}
for(i = 0;i < iSize;i++)
{
Tempimage = m_Tempimages.front();
if(i == num)
{
return Tempimage;
}
m_Tempimages.pop();
}
return Tempimage;
}
void ImageMatQueue::saveimg(std::string csImage,cv::Mat& mat)
{
imwrite(csImage, mat);
}
int ImageMatQueue::getMatSum()
{
int iSum = 0;
iSum = m_images.Size();
return iSum;
}
bool ImageMatQueue::empty()
{
return m_images.Size()==0 && m_pImages.Size()==0;
}
void ImageMatQueue::proc()
{
while(bRun)
{
this_thread::sleep_for(std::chrono::milliseconds(5));
{
if(m_pImages.Size()>0)//m_images.empty() &&
{
if (pixType!=-1)
{
cv::Mat matPicImage;
cv::Mat matFront,matBack;
vector<cv::Mat> mats;
switch(DevModel)
{
case 0://G100
case 1://G200//Õý·´ÃæͼÏñ·Ö¿ªµÄ
{
if (m_pImages.Size()>=2)
{
matFront=m_pImages.Take().getMat(pixType);
matBack=m_pImages.Take().getMat(pixType);
mats.push_back(matFront);
if (duplexFlag)
{
mats.push_back(matBack);
}
if (b_save_origin)
{
CString csName;
SYSTEMTIME st = { 0 };
GetLocalTime(&st); //»ñÈ¡µ±Ç°Ê±¼ä ¿É¾«È·µ½ms
csName.Format("%02d%02d%02d.jpg", st.wHour, st.wMinute, st.wSecond);
CString csImage;
csImage = csPath + "\\G200-Origin" + csName;
saveimg(std::string(csImage.GetBuffer()), matBack);
}
for (int j = 0; j < m_iaList.size(); j++)
{
m_iaList[j]->apply(mats, duplexFlag);//ÐèÒªÔÚÿ¸öͼÏñ´¦ÀíapplyµÄ²¿·Ö Ôö¼ÓÅжÏÀï±ßµÄmatÊÇ·ñΪ¿Õ Ä¿Ç°»¹Ã»¼Ó
}
}
}
break;
case 2://G300
case 3://G400
case 4://G500 Õý·´ÃæͼÏñÔÚÒ»¸±Í¼ÉÏ£¬ÐèÒª¾ù·ÖͼÏñ
{
cv::Mat mat=m_pImages.Take().getMat(pixType);
matFront=mat(cv::Rect(0,0,mat.cols/2,mat.rows));
matBack=mat(cv::Rect(mat.cols/2,0,mat.cols/2,mat.rows));
if (duplexFlag)
{
mats.push_back(matBack);
}
if (b_save_origin)
{
CString csName;
SYSTEMTIME st = { 0 };
GetLocalTime(&st); //»ñÈ¡µ±Ç°Ê±¼ä ¿É¾«È·µ½ms
csName.Format("%02d%02d%02d.jpg", st.wHour, st.wMinute, st.wSecond);
CString csImage;
csImage = csPath + "\\G500-Origin" + csName;
saveimg(std::string(csImage.GetBuffer()), matBack);
}
for (int j = 0; j < m_iaList.size(); j++)
{
m_iaList[j]->apply(mats, duplexFlag);//ÐèÒªÔÚÿ¸öͼÏñ´¦ÀíapplyµÄ²¿·Ö Ôö¼ÓÅжÏÀï±ßµÄmatÊÇ·ñΪ¿Õ Ä¿Ç°»¹Ã»¼Ó
}
mats.push_back(matFront);
XdPrint("m_pImagesÈ¡Í굱ǰÕý·´Ãæ==========================\n");
}
break;
default:
break;
}
static int index = 0;
if (b_save_fixed_origin)
{
for (int i = 0; i < mats.size(); i++)
{
//CString outinfo;
//outinfo.Format("Tring to save image index of %d \n", ++index);
//XdPrint(outinfo.GetBuffer());
if (!mats[i].empty())
{
CString csName;
SYSTEMTIME st = { 0 };
GetLocalTime(&st); //»ñÈ¡µ±Ç°Ê±¼ä ¿É¾«È·µ½ms
csName.Format("%02d%02d%02d.jpg", st.wHour, st.wMinute, st.wSecond);
CString csImage;
csImage = csPath + "\\G300-" + csName;
saveimg(std::string(csImage.GetBuffer()), mats[i]);
//outinfo.Format("Saved image index of %d \n", index);
//XdPrint(outinfo.GetBuffer());
}
}
}
//if (!mats[0].empty()&&!mats[1].empty())
if (!mats[0].empty())
{
for (int i=0,length=mats.size();i<length;i++)
{
if (!mats[i].empty())
{
m_images.Put(mats[i]);
}
}
}//end if !mats[0].empty()&&!mats[1].empty()
}
}
}
}
}