GrpcPrint/PrintS/camera/HBDCamera.cpp

201 lines
5.2 KiB
C++
Raw Normal View History

2024-03-26 10:33:00 +08:00
#include "HBDCamera.h"
#include "../config/ConfigManager.h"
#include <gl/GL.h>
#include <GL/khronos_glext.h>
#include <fstream>
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;
}