#include "StdAfx.h" #include "ExportImgShowBase.h" #include "ImgShowDlg.h" #include "QB_ImgProcessFun.h" #include "GlobalFunc.h" // 构造函数 CExportImgShowBase::CExportImgShowBase(void) { m_ShowDlg = NULL; } // 析构函数 CExportImgShowBase::~CExportImgShowBase(void) { try { ClearMemory(); // 销毁窗口 DestroyWnd(); m_ShowDlg = NULL; } catch(cv::Exception &e) { e.what(); std::abort(); } catch(...) { std::abort(); } } // 功能:创建视频显示窗口 BOOL CExportImgShowBase::CreateWnd(const HWND hParentWnd) { BOOL ret = FALSE; try { // 输入父窗口有效性验证 if (hParentWnd == NULL) { return FALSE; } // 基于窗口句柄,获取窗口指针 CWnd* pParWnd = CWnd::FromHandle(hParentWnd); // 当m_ShowDlg为空时,创建dialog if (m_ShowDlg == NULL) { //return TRUE; // 新建视频显示窗口对象 m_ShowDlg = new CImgShowDlg(); if (pParWnd != NULL) { // 创建窗口 ret = m_ShowDlg->Create(IDD_IMG_SHOW_DIALOG, pParWnd); } else { // 释放对象 SAFE_DELETE(m_ShowDlg); m_ShowDlg = NULL; } } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 功能:移动(设置)窗口(整个视频显示窗口)至指定位置 void CExportImgShowBase::MoveWnd(const CRect &clientRect) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { // 移动窗口至指定位置 m_ShowDlg->MoveWindow(clientRect); // 设置指北针中心坐标 // CRect rect; // m_ShowDlg->GetClientRect(&rect); // POINT center; // center.x = 60L; // center.y = 60L; // // m_ShowDlg->SetNorthDirectionCenter(center); } } catch (...) { return; } } // 功能:显示或隐藏窗口,由nCmdShow决定 // #define SW_HIDE 0 // #define SW_SHOWNORMAL 1 // #define SW_NORMAL 1 // #define SW_SHOWMINIMIZED 2 // #define SW_SHOWMAXIMIZED 3 // #define SW_MAXIMIZE 3 // #define SW_SHOWNOACTIVATE 4 // #define SW_SHOW 5 // #define SW_MINIMIZE 6 // #define SW_SHOWMINNOACTIVE 7 // #define SW_SHOWNA 8 // #define SW_RESTORE 9 // #define SW_SHOWDEFAULT 10 // #define SW_FORCEMINIMIZE 11 // #define SW_MAX 11 // 功能:显示SW_SHOW 或隐藏 SW_HIDE 窗口 已验证 void CExportImgShowBase::ShowWnd(const int nCmdShow) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { m_ShowDlg->ShowWindow(nCmdShow); } } catch(...) { } } // 功能:显示一帧图像 BOOL CExportImgShowBase::ShowImage(const BITMAPINFO* pImgInfo, BYTE* pImgData, GeoBoundingBox LBbox, BOOL isNeedFlip, BOOL isNeedClip, const CRect* pShowRegion, float Strecth_Ratio, POINT xyShift) { BOOL ret = FALSE; try { if (m_ShowDlg == NULL && m_ShowDlg->GetSafeHwnd() == NULL) { return FALSE; } // 数据有效性验证 if ( (pImgInfo == NULL) || (pImgData == NULL)) { return FALSE; } // 设置一路输入正在输入标识 m_ShowDlg->SetFirstSignal(TRUE); // biBitCount 验证 if(pImgInfo->bmiHeader.biBitCount != 24 && pImgInfo->bmiHeader.biBitCount != 8) { m_ShowDlg->SetFirstSignal(FALSE); return FALSE; } // 更新数据至全局变量:LatestQBData if (pImgInfo->bmiHeader.biWidth > 0 && pImgInfo->bmiHeader.biHeight > 0 && pImgData != NULL) { // 设置一路输入正在输入标识 m_ShowDlg->SetFirstSignal(TRUE); // 构建临时对象 QBStru local; local.image.srcImg.ImgWidth = pImgInfo->bmiHeader.biWidth; local.image.srcImg.ImgHeight = pImgInfo->bmiHeader.biHeight; local.image.srcImg.bitcount = pImgInfo->bmiHeader.biBitCount; // 步长:每行像素所占字节数 int lineByte = (pImgInfo->bmiHeader.biWidth * pImgInfo->bmiHeader.biBitCount / 8); // 位图数据缓冲区的大小,即图像大小 int imgBufSize = pImgInfo->bmiHeader.biHeight * lineByte; if ( imgBufSize > 0) { local.image.srcImg.buff = new BYTE[imgBufSize]; if (local.image.srcImg.buff != NULL) { // 复制实际字节数 memcpy(local.image.srcImg.buff, pImgData, static_cast(imgBufSize)); // 图像数据复制 // 设置图像数据有效 local.image.bValid = true; // 是否需要反转 if (isNeedFlip == TRUE) { FlipImgStru(&local.image.srcImg); } } } local.image.srcImg.BoundingBox = LBbox; // 将 local 复制到 m_LatestQBData m_ShowDlg->SetLatestQBData(local); m_ShowDlg->SetBoundingBox(LBbox); // 释放 local if (local.image.srcImg.buff != NULL) { SAFE_DELETE_ARRAY(local.image.srcImg.buff); } // 显示图像 if (m_ShowDlg != NULL) { // 接口转换 CRect ShowRegion; if (pShowRegion != NULL) { ShowRegion = *pShowRegion; } ret = m_ShowDlg->ShowOneImage(const_cast(pImgInfo), pImgData, isNeedClip, ShowRegion, isNeedFlip, Strecth_Ratio, xyShift); } // 图像去雾 亮度调节 对比度调节 清晰度调节 复位 m_ShowDlg->SetiLatest(0); // 最近的一次 m_ShowDlg->SetiPreLatest(0); // 最近的一次的前一次 // 关闭1路正在输入标识 m_ShowDlg->SetFirstSignal(FALSE); } return ret; } catch(cv::Exception &e) { e.msg; return ret; } catch(...) { return ret; } } // 功能:解压后的情报数据处理函数 void CExportImgShowBase::DisposeQBData(const QBStru* qbData) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal()) // 1路信号正在输入,直接返回 { return; } else // 关闭3路信号 输入2路信号 { // 设置2路输入正在输入标识 m_ShowDlg->SetSecondSignal(TRUE); // 输入二路信号 m_ShowDlg->DisposeQBData(qbData); // 关闭2路输入正在输入标识 m_ShowDlg->SetSecondSignal(FALSE); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:标绘目标,其中输入为目标点像素坐标 void CExportImgShowBase::SetTargetPixelCoordinate(const CPoint &pt) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->SetTargetPixelCoordinate(pt); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:标绘图像中的一块区域,其中输入为4个像素坐标点 void CExportImgShowBase::SetQuadrangleCorners(const POINT* pts) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->SetQuadrangleCorners(pts); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:标绘目标,其中输入为经纬度坐标 void CExportImgShowBase::SetTgtLocLeadLonLat(double lon, double lat) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->SetTgtLocLeadLonLat(lon, lat); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:删除视频显示窗口,同时释放所有占用资源 void CExportImgShowBase::DestroyWnd() { try { // 释放MFC对话框资源 if (m_ShowDlg != NULL) { m_ShowDlg->DestroyWindow(); } // 释放对象 SAFE_DELETE(m_ShowDlg); m_ShowDlg = NULL; } catch(...) { return; } } // 8 功能:清理内存及记忆 void CExportImgShowBase::ClearMemory() { try { // 输入函数指针callBackFun 有效性验证 if (m_ShowDlg != NULL) { m_ShowDlg->ClearMemory(); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:设置回调函数,双击像素坐标 BOOL CExportImgShowBase::SetCallBackFun(SendCoordinateProc proc) { BOOL ret = FALSE; try { // 输入函数指针callBackFun 有效性验证 if ((m_ShowDlg != NULL) && (proc != NULL)) { ret = m_ShowDlg->SetCallBackFun(proc); } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 功能:设置回调函数,像素信息传递到外部CSU中 BOOL CExportImgShowBase::SetCallBackFun(SendPixInfoProc proc) { BOOL ret = FALSE; try { // 输入函数指针callBackFun 有效性验证 if ((m_ShowDlg != NULL) && (proc != NULL)) { ret = m_ShowDlg->SetCallBackFun(proc); } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 功能:设置回调函数,传递保存文件路径到外部CSU中 BOOL CExportImgShowBase::SetCallBackFun(SendFilePath proc) { BOOL ret = FALSE; try { // 输入函数指针callBackFun 有效性验证 if ((m_ShowDlg != NULL) && (proc != NULL)) { ret = m_ShowDlg->SetCallBackFun(proc); } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 5 功能:设置回调函数,目标定位导引经纬度到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL CExportImgShowBase::SetCallBackFun(SendTgrLocLeadLonLatProc proc) { BOOL ret = FALSE; try { // 输入函数指针callBackFun 有效性验证 if ((m_ShowDlg != NULL) && (proc != NULL)) { ret = m_ShowDlg->SetCallBackFun(proc); } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 6 功能:设置回调函数,火炮校射信息输出到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL CExportImgShowBase::SetCallBackFun(SendArtilleryReviseInfoProc proc) { BOOL ret = FALSE; try { // 输入函数指针callBackFun 有效性验证 if ((m_ShowDlg != NULL) && (proc != NULL)) { ret = m_ShowDlg->SetCallBackFun(proc); } return ret; } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } } // 功能:保存当前帧至本地文件 void CExportImgShowBase::SaveCurrentFrame(CString sSaveFolder) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE || m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->SetSaveCurrentImgFolder(sSaveFolder); m_ShowDlg->SaveCurrentDecodedFrame(); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:是否需要记忆前面多帧(18帧)图像信息 void CExportImgShowBase::MemPreMultiFrame(BOOL bMem) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->MemPreMultiFrame(bMem); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:通过鼠标滚轮,实现图像放大缩小 BOOL CExportImgShowBase::OnMouseWheelZoomInOutImg(UINT nFlags, short zDelta, CPoint pt) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()/* && nFlags == MK_CONTROL*/) { // 调用VideoShowDlg里面的 OnMouseWheel 操作SrcFrame return m_ShowDlg->OnMouseWheel(nFlags, zDelta, pt); } } catch(cv::Exception &e) { e.msg; return FALSE; } catch(...) { return FALSE; } return FALSE; } // 功能:取消目标标绘 void CExportImgShowBase::CancelTargetPlot() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->OnConcelTargetPlot(); } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:图像去雾 void CExportImgShowBase::AdjustImgDehaze(BOOL bAdjust, int A_MAX, double degree) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->AdjustImgDehaze(bAdjust, A_MAX, degree); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:图像亮度调节 void CExportImgShowBase::AdjustImgIntensity(BOOL bAdjust, int degree) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->AdjustImgIntensity(bAdjust, degree); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:图像对比度调节 void CExportImgShowBase::AdjustImgContrast(BOOL bAdjust, int degree) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->AdjustImgContrast(bAdjust, degree); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:图像清晰度调节 void CExportImgShowBase::AdjustImgDefinition(BOOL bAdjust, int degree) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->AdjustImgDefinition(bAdjust, degree); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:返回图像调节上一步图像状态 void CExportImgShowBase::ReturnToPreImgState() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->ReturnToPreImgState(); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:返回原始图像状态 void CExportImgShowBase::ReturnToSrcImgState() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { if (m_ShowDlg->GetFirstSignal() == FALSE || m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->ReturnToSrcImgState(); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 功能:保存当前图像为TIFF格式 void CExportImgShowBase::SaveImgToTiff() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { // 无外部信号输入 本地操作 if (m_ShowDlg->GetFirstSignal() == FALSE && m_ShowDlg->GetSecondSignal() == FALSE) { m_ShowDlg->SaveToGeoTiff(); } } } catch(cv::Exception &e) { e.msg; return; } catch(...) { return; } } // 18 功能:设置图像编辑类型 void CExportImgShowBase::SetImgEditType(int type) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { m_ShowDlg->SetImgEditType(type); } } catch(cv::Exception &e) { e.what(); } catch (...) { } } // 19 功能:获取图像编辑模式 bool CExportImgShowBase::GetImgEditMode() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd()) { return m_ShowDlg->GetImgEditMode(); } } catch(cv::Exception &e) { e.what(); return true; } catch (...) { return true; } return true; } // 21 功能:几何校正图像并显示图像 // 输入: // 无 // 返回: // 无 void CExportImgShowBase::GeoCorrectAndShowImg() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { return m_ShowDlg->GeoCorrectAndShowImg(); } } catch(cv::Exception &e) { e.what(); return; } catch (...) { return; } } // 22 功能:获取当前显示图像 // 输入: // 无 // 返回: // 无 bool CExportImgShowBase::GetCurrentImg(int &imgWidth, int &imgHeight, int& bitCount, uchar* &pImgData) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { cv::Mat img = m_ShowDlg->GetCurrentImg(); if (img.empty() == true) { return false; } else { imgWidth = img.cols; imgHeight = img.rows; if (img.type() == CV_8UC1) { bitCount = 8; } else if (img.type() == CV_8UC3) { bitCount = 24; } else { return false; } pImgData = nullptr; pImgData = new uchar[imgHeight * imgWidth * bitCount]; if (pImgData != nullptr) { memcpy(pImgData, img.data, imgHeight * imgWidth * (bitCount / 8)); } return true; } } } catch(cv::Exception &e) { e.what(); return false; } catch (...) { return false; } return false; } // 23 功能:获取图像边界地理坐标 // 输入: // 无 // 输出: // 1:leftLon 西经 // 2:topLat 北纬 // 3:rigtLon 东经 // 4:bottomLat 南纬 // 返回值: // 成功返回true,失败返回false bool CExportImgShowBase::GetImgBoundingBox(double &leftLon, double &topLat, double &rigtLon, double &bottomLat) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { return m_ShowDlg->GetImgBoundingBox(leftLon, topLat, rigtLon, bottomLat); } } catch(cv::Exception &e) { e.what(); return false; } catch (...) { return false; } return false; } // 23 功能:获取当前显示图像中心经纬度 // 输入: // 无 // 输出: // 1:lon 经度 // 2:lat 纬度 // 返回值: // 成功返回true,失败返回false bool CExportImgShowBase::GetCurrentImgCerterLonLat(double &lon, double &lat) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { return m_ShowDlg->GetCurrentImgCenterLonLat(lon, lat); } } catch(cv::Exception &e) { e.what(); return false; } catch (...) { return false; } return false; } // 24 功能:标注图像(矩形、区域边缘) // 输入: // 1. 区域边缘点 集合 // 输出: // 无 // 返回值: // 无 void CExportImgShowBase::MarkRegionOnImg(std::vector> &valisContours) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { m_ShowDlg->MarkRegionOnImg(valisContours); } } catch(cv::Exception &e) { e.what(); } catch (...) { } } // 25 功能:屏蔽右键菜单 // 输入: // 1. bClose 默认true关闭 // 输出: // 无 // 返回值: // 无 void CExportImgShowBase::CloseRightBtnDownMenu(bool bClose) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { m_ShowDlg->CloseRightBtnDownMenu(bClose); } } catch(cv::Exception &e) { e.what(); } catch (...) { } } // 26 功能:设置空屏文字 // 输入: // 1. str 主题文字 // 输出: // 无 // 返回值: // 无 void CExportImgShowBase::SetThemeText(CString str) { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { m_ShowDlg->SetThemeText(str); } } catch(cv::Exception &e) { e.what(); } catch (...) { } } // 28 功能:图像位置导引(同内部目标定位导引) void CExportImgShowBase::LeadImgLoc() { try { if (m_ShowDlg != NULL && m_ShowDlg->GetSafeHwnd() != NULL) { m_ShowDlg->LeadImgLoc(); } } catch(cv::Exception &e) { e.what(); } catch (...) { } }