#pragma once #include "resource.h" // 回调函数定义 #include "CallBackDef.h" // openCV #include using namespace cv; #include // 队列 using namespace std; // 包含情报结构体文件 #include "QBStru.h" // 快速查找图像 #include "FastLookUpDlg.h" // CImgShowDlg 对话框 class CImgShowDlg : public CDialog { DECLARE_DYNAMIC(CImgShowDlg) public: CImgShowDlg(CWnd* pParent = NULL); // 标准构造函数 virtual ~CImgShowDlg(); // 对话框数据 enum { IDD = IDD_IMG_SHOW_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 public: /* part1:公有成员函数 */ // 功能:设置回调函数 // 输入: // 1: proc: 函数指针 // 返回值:设置成功返回TRUE,否则返回FALSE BOOL SetCallBackFun(SendCoordinateProc proc); // 功能:设置回调函数,像素信息传递到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL SetCallBackFun(SendPixInfoProc proc); // 功能:设置回调函数,传递保存文件路径到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL SetCallBackFun(SendFilePath proc); // 功能:设置回调函数,目标定位导引经纬度到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL SetCallBackFun(SendTgrLocLeadLonLatProc proc); // 功能:设置回调函数,目标定位导引经纬度到外部CSU中 // 输入: // 1.proc: 函数指针 // // 输出: 设置成功返回TRUE,否则返回FALSE BOOL SetCallBackFun(SendArtilleryReviseInfoProc proc); // 1.2 功能:在对话框中显示一帧图像 // 输入: // 1: pImgInfo: 图像头 // 2: pImgData: 图像数据 // 3: isNeedClip: 是否只显示图像部分区域; 如果TRUE,根据参数4确定显示区域,否则,全景显示;默认为FALSE,即全景显示 // 4:ShowRegion:要显示的部分图像区域,当ShowRegion值不合理时,全景显示图像 // 5:isNeedFlip:图像是否反转显示,TRUE时反转显示 // 6: StrecthRatio:图像拉伸比例控制 // 7:xyShift:图像平移控制 // // 返回值:显示成功返回TRUE,否则返回FALSE BOOL ShowOneImage(const BITMAPINFO* pImgInfo, BYTE* pImgData, BOOL isNeedClip = FALSE, const CRect &ShowRegion = CRect(), BOOL isNeedFlip = FALSE, float StrecthRatio = 1.0F, POINT xyShift = POINT()); // 1.3 功能:在对话框中显示一帧图像 // 输入: // 1: img: OpenCV图像结构体 // 2: isNeedClip: 是否只显示图像部分区域; 如果TRUE,根据参数3确定显示区域,否则,全景显示;默认为FALSE,即全景显示 // 3:ShowRegion:要显示的部分图像区域,当ShowRegion值不合理时,全景显示图像 // 4:Strecth_Ratio:图像显示拉伸比例控制 图像平移控制 // 5:xyShift:图像平移控制 // // 返回值:显示成功返回TRUE,否则返回FALSE BOOL ShowOneImage( const IplImage* img, BOOL isNeedClip = FALSE, const CRect &ShowRegion = CRect(), float StrecthRatio = 1.0F, POINT xyShift = POINT()); // 1.4 功能:在对话框中显示一帧图像 // 输入: // 1: img: OpenCV图像结构体 // 2:Strecth_Ratio:图像显示拉伸比例控制 // 3:xyShift:图像平移控制 // // 返回值:显示成功返回TRUE,否则返回FALSE BOOL ShowWholeImage(const IplImage* img, float StrecthRatio = 1.0F, POINT &xyShift = POINT()); // 1.5 功能:设置目标点像素坐标,如果设置合理,在在显示窗口中标绘目标 // 返回值:始终返回TRUE,不对输入值做判断 BOOL SetTargetPixelCoordinate(const CPoint &point); // 1.6 功能:绘制四个角点连成的区域,用于图像拼接时标注当前视场 // 返回值:数值有效返回TRUE,否则返回FALSE BOOL SetQuadrangleCorners(const POINT *pts); // 功能:标绘目标,其中输入为经纬度坐标 // 输入: // 1. pt:经纬度坐标 // // 输出:在窗口标绘目标 // 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4(ShowImage)输入之后 输入本函数 void SetTgtLocLeadLonLat(double lon, double lat); // 1.7 功能:绘制指北针 // 输入: // 1.center: 中心点坐标 // 2.angle: 角度 // 输出: 无 // 函数状态:已验证 //void DrawNorthDirection(const POINT ¢er, double angle); // 1.8 功能:设置指北针中心 // 输入: // 1.center: 中心点坐标 // // 输出: 赋值给私有成员变量m_NorthDirectionCenter // 函数状态:已验证 //void SetNorthDirectionCenter(const POINT ¢er); // 1.9 功能:基于全局变量LatestQBData 显示图像和指北针 // 说明:当dst有效时,优先显示dst,否则显示src void ShowLatestQBData(); // 1.10 功能:获取双击目标点坐标 m_LButtonDblClkPixelCoordinate CPoint GetTargetCoordinate(); // 1.11 功能:在对话框左上角显示信息 void ShowMessageOnDialog(CString msg); // 1.12 功能:保存当前帧图像及信息 // 输入: // 输出: 保存数据到本地文件,成功时返回TRUE,否则返回FALSE // 说明:存储条件:图像数据有效(复接数据有效则存储,无效则不存); BOOL SaveCurrentDecodedFrame(); // 1.13 功能:是否需要记忆前面多帧(18帧)图像信息 // 输入: // 1. bMem TRUE:记忆 FALSE:不记忆 // 输出:无 void MemPreMultiFrame(BOOL bMem = TRUE); // 1.14 功能:保存多帧图像及信息 // 输入: // 输出: 保存数据到本地文件,返回成功保存的帧数 int SavePreMultiDecodedFrames(); // 1.15 功能:设置m_LatestQBData void SetLatestQBData(const QBStru &qbData); // 1.16 功能:释放m_LatestQBData void ReleaseLatestQBData(); // 设置经纬度盒子 void SetBoundingBox(GeoBoundingBox box); // 1.17 功能:QBStru结构体情报数据处理函数 // 输入: // 1.qbData: 情报数据结构体变量指针 // // 输出: 无 void DisposeQBData(const QBStru* qbData); // 功能:保存m_LatestQBData为tiff,并回调保存路径 void SaveToGeoTiff(); // 1.25 设置/获取1路信号是否正在输入 void SetFirstSignal(BOOL bflag); BOOL GetFirstSignal(); // 1.26 设置/获取2路信号是否正在输入 void SetSecondSignal(BOOL bflag); BOOL GetSecondSignal(); // 1.27 设置/获取iLatest:刚才是什么图像处理操作 void SetiLatest(int i); int GetiLatest(); // 1.28 设置/获取iPreLatest:上次是什么图像处理操作 void SetiPreLatest(int i); int GetiPreLatest(); // 1.29 功能:清理内存及记忆 void ClearMemory(); // 功能:图像去雾 void AdjustImgDehaze(BOOL bAdjust, int A_MAX, double degree); // 功能:图像亮度调节 void AdjustImgIntensity(BOOL bAdjust, int degree); // 功能:图像对比度调节 void AdjustImgContrast(BOOL bAdjust, int degree); // 功能:图像清晰度调节 void AdjustImgDefinition(BOOL bAdjust, int degree); // 功能:返回图像调节上一步图像状态 void ReturnToPreImgState(); // 功能:返回原始图像状态 void ReturnToSrcImgState(); // 18 功能:设置图像编辑类型 void SetImgEditType(int type); // 获取图像编辑模式 true 增强 false 标记 bool GetImgEditMode(); // 20 功能:显示记忆图像队列中的指定某一张图像 // 输入: // 1:order 图像序号 // 返回: // 无 void ShowSelectedImgInMem(int order); // 设置文件夹 void SetSaveCurrentImgFolder(CString str); // 保存当前图像文件夹 void SetSavePreMultiImgFolder(CString str); // 保存多帧图像文件夹 // 21 功能:几何校正并显示图像 void GeoCorrectAndShowImg(); // 22 功能:获取当前显示图像 cv::Mat GetCurrentImg(); // 功能:获取当前图像中心的经纬度坐标 bool GetCurrentImgCenterLonLat(double &lon, double &lat); // 24 功能:标注图像(矩形、区域边缘) // 输入: // 1. 区域边缘点 集合 void MarkRegionOnImg(std::vector> &valisContours); // 功能:屏蔽右键按钮菜单 void CloseRightBtnDownMenu(bool bClose = true); // 功能:设置空屏文字 void SetThemeText(CString str); // 功能:获取图像边界地理坐标 // 输入: // 无 // 输出: // 1:leftLon 西经 // 2:topLat 北纬 // 3:rigtLon 东经 // 4:bottomLat 南纬 // 返回值: // 成功返回true,失败返回false bool GetImgBoundingBox(double &leftLon, double &topLat, double &rigtLon, double &bottomLat); // 功能:图像位置导引(同内部目标定位导引) void LeadImgLoc(); private: /* part3:私有成员函数 */ // 3.1 功能:基于当前图像显示状态 和 像素坐标(图像某点的像素坐标),求该像素坐标对应的客户区坐标 // 输入: // 1: PixelCoordinate: 像素坐标 // 返回值:当前像素坐标的客户区坐标,当该像素未显示时,返回无效值(-100,-100) CPoint GetScreenCoordinateBasedOnPixelCoordinate(const POINT &PixelCoordinate); // 3.2 功能:给定屏幕坐标,在屏幕中绘制标框, (可能)同时清除上次绘制的标框 // 输入: // 1: screenCoordinate: 屏幕坐标 // 返回值:无 void DrawSquareOnScreen(const POINT &screenCoordinate, BOOL bErase = TRUE); // 3.3 功能: 当放大图像时,自适应计算新的图像显示区 // 输入: // 1: bIn : 当前鼠标位置是否在图像上,在图像上为TRUE,不在图像上为FALSE // 2: pixelCoordinate : 当前鼠标位置对应的图像像素坐标 // 输出: 函数返回图像显示区域 //CRect GetNewRegionWhenZoomIn(); // 3.4 功能: 当放大缩小时,自适应计算新的图像显示区 // // 输出: 函数返回图像显示区域 //CRect GetNewRegionWhenZoomOut(); CRect GetNewRegionWhenZoom(bool in); // 3.5 功能: 当漫游图像时,自适应计算新的图像显示区 // 输入: // 1: deltaX : x方向图像像素偏移量 // 2: deltaY : y方向图像像素偏移量 // 输出: 函数返回图像显示区域 CRect GetNewRegionWhenRoamImg(int deltaX, int deltaY); // 3.6 功能: 执行图像放大操作 // 输入: // 1: point: 当前鼠标点击位置坐标(屏幕坐标) void DoZoomInImg(); // 3.7 功能: 执行图像缩小操作 void DoZoomOutImg(); // 3.8 功能: 执行图像全景(全屏)操作 void DoZoomFitImg(); // 3.9 功能:设置图像在屏幕中的显示比例 // 输入:ratio 【0 1】 // 说明:0 最小 1 全屏 void SetImgShowRationOnScreen(float ratio); // 3.10 功能:m_LatestQBData 入队列 // 输入: // 输出: // 说明:只有当m_LatestQBData图像数据有效时,方可入队 void PushLatestQBData2Deque(); // 3.11 功能:给定屏幕4个坐标,在屏幕中绘制四边形, (可能)同时清除上次绘制 // 输入: // 1: screenCoordinate: 屏幕坐标 // 返回值:无 void DrawQuadrangleOnScreen(const POINT screenCoordinate[4], BOOL bErase = TRUE); // 功能:向图像中添加 经纬高 位置信息 // 输入: // 1: imgData: 图像结构体 // 2: pt: 像素坐标 // 3. Lon: 经度 // 4. Lat: 纬度 // 5. H: 高度 // 返回值:无 void TagLocationOnImgStru(ImgStru &imgData, cv::Point pt, double Lon, double Lat, double H); // 功能:向图像中添加 经纬高 位置信息 // 输入: // 1: qb: 情报结构体 // 2: pt: 像素坐标 // 3. Lon: 经度 // 4. Lat: 纬度 // 5. H: 高度 // 返回值:无 void TagLocationOnQBData(QBStru &qb, cv::Point pt, double Lon, double Lat, double H); // 功能:向图像中添加 经纬高 位置信息 // 输入: // 1: img: 情报结构体 // 2: pt: 像素坐标 // 3. Lon: 经度 // 4. Lat: 纬度 // 5. H: 高度 // 返回值:无 void TagLocationOnMatImg(cv::Mat &img, cv::Point pt, double Lon, double Lat, double H); // 功能:向图像中添加 文字 信息 // 输入: // 1: qb: 情报结构体 // 2: pt: 像素坐标 // 3. text: 文字信息 // 返回值:无 void TagTextOnQBData(QBStru &qb, cv::Point pt, CString text); // 功能:向图像中添加 文字 信息 // 输入: // 1: imgData: 图像结构体 // 2: pt: 像素坐标 // 3. text: 文字信息 // 返回值:无 void TagTextOnImgStru(ImgStru &imgData, cv::Point pt, CString text); // 功能:向图像中添加 文字 信息 // 输入: // 1: img: 情报结构体 // 2: pt: 像素坐标 // 3. text: 文字信息 // 返回值:无 void TagTextOnMatImg(cv::Mat &img, cv::Point pt, CString text); // 功能:向图像中标绘 火炮校射 信息 // 输入: // 1: img: 图像 // 2: pt1: 像素坐标 起点 // 3: pt2: 像素坐标 终点 // 4. LLA1: 起点经纬高 // 5. LLA2: 终点经纬高 // 返回值:无 void TagInfoReviseShotOnMatImg(cv::Mat &img, cv::Point pt1, cv::Point pt2, double *LLA1, double *LLA2); // 功能:向图像中标绘 火炮校射 信息 // 输入: // 1: imgData: 图像结构体 // 2: pt1: 像素坐标 起点 // 3: pt2: 像素坐标 终点 // 4. LLA1: 起点经纬高 // 5. LLA2: 终点经纬高 // 返回值:无 void TagInfoReviseShotOnImgStru(ImgStru &imgData, cv::Point pt1, cv::Point pt2, double *LLA1, double *LLA2); // 功能:向图像中标绘 火炮校射 信息 // 输入: // 1: imgData: 图像结构体 // 2: pt1: 像素坐标 起点 // 3: pt2: 像素坐标 终点 // 4. LLA1: 起点经纬高 // 5. LLA2: 终点经纬高 // 返回值:无 void TagInfoReviseShotOnQBData(QBStru &qbData, cv::Point pt1, cv::Point pt2, double *LLA1, double *LLA2); public: // 功能:通过鼠标右键加载一帧图像,接口与模块函数:ShowImage 接口完全一致 void LoadOneImgFromMenu(const BITMAPINFO* pImgInfo, BYTE* pImgData, GeoBoundingBox LBbox = GeoBoundingBox(), BOOL isNeedFlip = FALSE, BOOL isNeedClip = FALSE, const CRect* pShowRegion = NULL, float Strecth_Ratio = 1.0F, POINT xyShift = POINT()); private: /* part4:私有成员变量 */ // 当前情报数据结构体 QBStru m_LatestQBData; // 中间变量:图像去雾、亮度、对比度、清晰度调节的中间变量 ImgStru m_midImg; // 回调函数指针变量:文件路径 SendFilePath m_lpSendFilePath; // 回调函数指针变量 SendCoordinateProc m_lpSendCoordinate; // 回调函数指针变量:像素信息 SendPixInfoProc m_lpSendPixInfoProc; // 回调函数指针变量:定位导引 经纬度 SendTgrLocLeadLonLatProc m_lpSendTgrLocLeadLonLat; // 回调函数指针变量:火炮校射信息 SendArtilleryReviseInfoProc m_lpSendArtilleryReviseInfo; // 4.1 鼠标移动时 持续计算当前点的 像素坐标 经纬度坐标 RGB值 cv::Point2i m_imgPixel_XY_Coordinate; cv::Point3d m_imgPixel_LBH_Coordinate; // 4.2 当前显示的图像区域(单位:像素) CRect m_ShowRegion; // 4.3 当前显示的图像区域在dialog中占有的空间(单位:像素) // 注:每次显示图像时更新 CRect m_ShowRegionOnScreen; // 4.4 图像控件宽 int m_PicCtrlWidth; // 4.5 图像控件高 int m_PicCtrlHeight; // 4.6 图像执行放大、缩小、漫游操作中,当左键按下时,鼠标点对应的图像像素坐标 CPoint m_LButtonDownPixelCoordinate; // 4.7 当前是否满足图像漫游条件 BOOL m_bStaisfyRoamImg; // 4.8 最近一次图像标绘画出的框(目标标绘) CRect m_LatestPlotRect; // 4.9 当前图像双击时的,像素坐标,无效时为(-1,-1) CPoint m_LButtonDblClkPixelCoordinate; // 4.10 是否在OnPaint中绘制标框的标志位 BOOL m_bPlotRectOnPaint; // 4.11 绘制指北针 中心 POINT m_NorthDirectionCenter; // 4.12 是否在OnPaint中绘制指北针的标志位 BOOL m_bPlotDirectionOnPaint; // 4.13 左键按下时鼠标坐标 POINT m_LeftButtonDown; // 4.15 当前显示的图像 IplImage* m_SrcFrame; // 4.16 图像显示拉伸比例控制 float m_ImgRatioOnScreen; // 4.17 图像显示 偏移量 POINT m_ImgShowShift; // 4.18 1路输入标志位 BOOL m_bFirstSignal; // 4.19 2路输入 BOOL m_bSecondSignal; // 4.20 图像去雾 亮度调节 对比度调节 清晰度调节 最近处理的是哪个 int m_iLatest; // 4.21 图像去雾 亮度调节 对比度调节 清晰度调节 最近处理的是哪个 前一个 int m_iPreLatest; // 4.22 数据存储目录(根目录):【情报数据】 CString m_sRootFolder; // 4.23 数据存储目录(一级子目录):【图像】 CString m_sImgSaveFolder; // 4.24 是否满足图像缩小显示且偏移的条件 BOOL m_bSatisfyMove; // 4.25 情报队列 存储之前的N帧情报数据 deque m_QBDataDeque; // 4.33 是否记忆记忆前期多帧图像信息标志位 BOOL m_bMemPreMultiFrame; // 4.34 图像拼接时,绘制最新图像四边形的四个角点 CRect m_LatestQuadrangle; // 屏幕坐标 POINT m_corners[4]; // 像素坐标 // 4.35 记录图像翻阅时 当前显示的图像 序号 int m_currentImgOrder; // 4.36 是否绘制矩形框的标志位 记忆 bool m_bPlotRect; // 经纬度盒子 读tiff图像用 GeoBoundingBox m_boundbingBox; // 图像编辑类型 int m_iImgEditType; bool m_bHaveOnPt; // 是否已经有一个点 cv::Point m_beginPixPt; // 像素起点 cv::Point m_endPixPt; // 像素终点 double m_beginLLA[3]; // 起点经纬高 double m_endLLA[3]; // 终点经纬高 bool m_bEnhanceEdit; // 区分上一步操作市增强还是编辑:true增强 / false编辑 // 快速查找图像对话框 CFastLookUpDlg *m_pFastLookUpDlg; CPoint m_RButtonPt; // 右键坐标 用于定位导引 CString m_sSaveCurrentImgFolder; // 保存当前图像文件夹 CString m_sSavePreMultiImgFolder; // 保存多帧图像文件夹 // 图像标绘中心记忆 cv::Point m_TargetCenter; // 图像目标标绘标记 BOOL m_bDrawSquareOnImg; // 经纬度校准偏移量 double m_deltaLon; double m_deltaLat; // 是否关闭右键按钮菜单 bool m_bCloseRughtBtnMenu; // 主题文字 CString m_sThemeText; // 目标抓取开关 bool m_bGetTgtImgOn; // 图像裁剪开关 bool m_bClipImgOn; // 像素坐标 CPoint m_clipImgFirstPt; CPoint m_clipImgSecondPt; // 屏幕坐标 CPoint m_clipImgFirstPtScreen; CPoint m_clipImgSecondPtScreen; bool m_haveValidFirstPt; // 互斥句柄 HANDLE m_hMutex_ProcessData; public: CString m_GDALLoadImgPath; // GDALj加载图像路径 DECLARE_MESSAGE_MAP() public: afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnPaint(); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnZoomInImg(); afx_msg void OnZoomOutImg(); afx_msg void OnZoomFitImg(); afx_msg void OnConcelTargetPlot(); afx_msg void OnSaveCurrentFrame(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); virtual BOOL OnInitDialog(); afx_msg void OnClearMemory(); afx_msg void OnSaveImgToTiff(); afx_msg void OnTagText(); afx_msg void OnReviseShot(); afx_msg void OnTagTgtLocation(); afx_msg void OnReturnToPreTag(); afx_msg void OnFastLookupImgs(); afx_msg void OnTgtLocLead(); afx_msg void OnGeoCorrectAndShow(); afx_msg void OnDrawSqureOnImg(); afx_msg void OnOpenOneImg(); afx_msg void OnTgtloccalibrate(); afx_msg void OnViewDeltaLonLat(); afx_msg void OnGetTargetImg(); afx_msg void OnClipImg(); };