201 lines
5.2 KiB
C++
201 lines
5.2 KiB
C++
|
#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;
|
||
|
}
|
||
|
|