#include "HBDCamera.h" #include "../config/ConfigManager.h" #include #include #include PointImageShowInfo::~PointImageShowInfo() { if (m_ShowTex > 0) { glDeleteTextures(1, &m_ShowTex); m_ShowTex = 0; } m_ImageMat.release(); } void PointImageShowInfo::Init(cv::Mat image, unsigned char* imageData) { m_ImageMat = image; m_ImageData = imageData; glGenTextures(1, &m_ShowTex); m_Width = m_ImageMat.cols; m_High = m_ImageMat.rows; m_PixelRatio = (float)m_Width / m_High; if (m_ShowTex > 0) { glBindTexture(GL_TEXTURE_2D, m_ShowTex); if (m_IsColor) { glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_Width, m_High, 0, GL_RGB, GL_UNSIGNED_BYTE, m_ImageMat.data); } else { glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_Width, m_High, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_ImageMat.data); } //glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); } } void PointImageShowInfo::Init() { if (m_ShowTex > 0) { glDeleteTextures(1, &m_ShowTex); m_ShowTex = 0; } if (m_ShowTex == 0) { glGenTextures(1, &m_ShowTex); m_Width = m_ImageMat.cols; m_High = m_ImageMat.rows; m_PixelRatio = (float)m_Width / m_High; glBindTexture(GL_TEXTURE_2D, m_ShowTex); if (m_IsColor) { glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_Width, m_High, 0, GL_RGB, GL_UNSIGNED_BYTE, m_ImageMat.data); } else { glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_Width, m_High, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_ImageMat.data); } //glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_Width, m_High, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_ImageMat.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); } } void PointImageShowInfo::Update() { if (m_ShowTex > 0) { glBindTexture(GL_TEXTURE_2D, m_ShowTex); if (m_IsColor) { //glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_High, GL_RGB, GL_UNSIGNED_BYTE, m_ImageMat.data); } else { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_High, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_ImageMat.data); } //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_High, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_ImageMat.data); glBindTexture(GL_TEXTURE_2D, 0); } } HBDCamera::HBDCamera() :m_DemandFlag(false) , m_ShowFlag(false) , m_OriginalData(NULL) , m_ImageChanged(false) , m_RunFlag(false) , m_CatpureThread(INVALID_HANDLE_VALUE) , m_Aspect(1.0f) //, m_ShowWidth(0) //,m_ShowHeight(0) { m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg(); m_CameraCalibrationCfg = ConfigManager::GetInstance()->GetCameraCalibrationCfg(); m_tjinstance = tjInitCompress(); InitializeCriticalSection(&m_OriginalDataCS); m_LastMouRefImgPosX = 0; m_LastMouRefImgPosY = 0; } HBDCamera::~HBDCamera() { StopCamera(); if (m_tjinstance)tjDestroy(m_tjinstance); DeleteCriticalSection(&m_OriginalDataCS); if (m_GLTex) { glDeleteTextures(1, &m_GLTex); m_GLTex = 0; } if (m_LogGLTex) { glDeleteTextures(1, &m_LogGLTex); m_LogGLTex = 0; } if (m_LogImage)tjFree(m_LogImage); } void HBDCamera::StartUp() { StopCamera(); m_RunFlag = true; m_CatpureThread = AtlCreateThread(CatpureProc, this); } unsigned int HBDCamera::GetShowImage(unsigned char * data, unsigned long size, int *width, int *height) { if (data == NULL || size == 0) return 0; int inSubsamp, inColorspace; tjhandle tjInstance = tjInitDecompress(); if (tjDecompressHeader3(tjInstance, data, size, width, height, &inSubsamp, &inColorspace) < 0) { tjDestroy(tjInstance); return 0; } unsigned char * ptmp = tjAlloc((*width) * (*height) * tjPixelSize[TJPF_GRAY]); if (tjDecompress2(tjInstance, data, size, ptmp, *width, 0, *height, TJPF_GRAY, 0) < 0) { tjFree(ptmp); tjDestroy(tjInstance); return 0; } tjDestroy(tjInstance); glDeleteTextures(1, &m_LogGLTex); m_LogGLTex = 0; GenTex(&m_LogGLTex, *width, *height, ptmp); tjFree(ptmp); return m_LogGLTex; } void HBDCamera::StopCamera() { if (m_CatpureThread != INVALID_HANDLE_VALUE) { m_RunFlag = false; if (WaitForSingleObject(m_CatpureThread, 500) == WAIT_TIMEOUT) { TerminateThread(m_CatpureThread, 1); } CloseHandle(m_CatpureThread); m_CatpureThread = INVALID_HANDLE_VALUE; } } DWORD WINAPI HBDCamera::CatpureProc(HBDCamera* _this) { if (_this) { _this->CatpureRun(); } return 0; } bool HBDCamera::GetRawImage(unsigned char* img) { if (!IsConnect()) return false; if (!m_DemandFlag) return false; if (!m_OriginalData) return false; EnterCriticalSection(&m_OriginalDataCS); memcpy_s(img, m_OriginalDataSize, m_OriginalData, m_OriginalDataSize); LeaveCriticalSection(&m_OriginalDataCS); return true; }