You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

664 lines
17 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include "resource.h"
// 回调函数定义
#include "CallBackDef.h"
// openCV
#include <opencv2\opencv.hpp>
using namespace cv;
#include <deque> // 队列
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即全景显示
// 4ShowRegion要显示的部分图像区域当ShowRegion值不合理时全景显示图像
// 5isNeedFlip图像是否反转显示TRUE时反转显示
// 6: StrecthRatio图像拉伸比例控制
// 7xyShift图像平移控制
//
// 返回值显示成功返回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即全景显示
// 3ShowRegion要显示的部分图像区域当ShowRegion值不合理时全景显示图像
// 4Strecth_Ratio图像显示拉伸比例控制 图像平移控制
// 5xyShift图像平移控制
//
// 返回值显示成功返回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图像结构体
// 2Strecth_Ratio图像显示拉伸比例控制
// 3xyShift图像平移控制
//
// 返回值显示成功返回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经纬度坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetTgtLocLeadLonLat(double lon, double lat);
// 1.7 功能:绘制指北针
// 输入:
// 1.center: 中心点坐标
// 2.angle: 角度
// 输出: 无
// 函数状态:已验证
//void DrawNorthDirection(const POINT &center, double angle);
// 1.8 功能:设置指北针中心
// 输入:
// 1.center: 中心点坐标
//
// 输出: 赋值给私有成员变量m_NorthDirectionCenter
// 函数状态:已验证
//void SetNorthDirectionCenter(const POINT &center);
// 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 功能:显示记忆图像队列中的指定某一张图像
// 输入:
// 1order 图像序号
// 返回:
// 无
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<std::vector<cv::Point>> &valisContours);
// 功能:屏蔽右键按钮菜单
void CloseRightBtnDownMenu(bool bClose = true);
// 功能:设置空屏文字
void SetThemeText(CString str);
// 功能:获取图像边界地理坐标
// 输入:
// 无
// 输出:
// 1leftLon 西经
// 2topLat 北纬
// 3rigtLon 东经
// 4bottomLat 南纬
// 返回值:
// 成功返回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<QBStru> 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();
};