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.
FP_ViewOnPlane/Include/QB_ImgProcessFun.h

403 lines
13 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.

#ifndef QB_IMGPROCESS_H
#define QB_IMGPROCESS_H
#ifdef IMGPROCESS_EXPORTS
#define IMGPROCESS_API __declspec(dllexport)
#else
#define IMGPROCESS_API __declspec(dllimport)
#endif
// OpenCV
#include <opencv2\opencv.hpp>
using namespace cv;
// 情报数据通用结构
#include "QBStru.h"
// 1. 图像去雾控制 算法:王家星
//1.1 功能:图像去雾控制(暗通道先验)
//输入: 1. qbData 通用情报数据结构体
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时) 有效范围【0,255】
// 3. degree 控制去雾效果, 有效范围【0,1】
// 4. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含去雾后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoDehazeCtrl(QBStru *qbData,
int A_MAX = -1,
double degree = 0.78,
bool bSrcFirst = true);
//1.2 功能:图像去雾控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时) 有效范围【0,255】
// 3. degree 控制去雾效果, 有效范围【0,1】
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoDehazeCtrl(ImgStru* src,
ImgStru* dst,
int A_MAX = -1,
double degree = 0.78);
// 2. 图像亮度控制 算法:王家星
//2.1 功能:图像亮度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制亮度, 有效范围【0,20】值越小越暗越大越亮
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImg dstImg——>dstImg
//输出: 1. qbData 含亮度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoIntensityCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//2.2 功能:图像亮度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 控制亮度,有效范围【0,20】值越小越暗越大越亮
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoIntensityCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 3. 图像对比度控制 算法:王家星
//3.1 功能:图像对比度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制对比度
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含对比度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoContrastCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//3.2 功能:图像对比度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 对比度亮度,有效范围【0,20】值越大对比度越强
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoContrastCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 4. 图像清晰度
//4.1 功能:图像清晰度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制清晰度
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含清晰度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoDefinitionCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//4.2 功能:图像清晰度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 清晰度控制,有效范围【0,20】值越大清晰度越好
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoDefinitionCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 5. 单帧图像目标定位 算法:王家星
//5.1 功能:计算图像中心点经纬度坐标、载荷等效俯仰角和方位角
//输入: 1. frame 输入复接数据
//
//输出: 1. Lon 图像中心点经度
// 2. Lat 图像中心点纬度
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCalImgCenterCoordinate(double &Lon,
double &Lat,
double &H,
const struQB_FJ *frame);
//5.2 功能:计算图像中任意点经纬度坐标
//输入: 1. frame 输入复接数据
// 2. pt_x
// 3. pt_y
//
//输出: 1. Lon 经度
// 2. Lat 纬度
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCalAnyPtCoordinate(double &Lon,
double &Lat,
double &H,
const struQB_FJ *frame,
int pt_x,
int pt_y);
// 6. 几何校正 算法:王家星
//6.1 功能:基于复接数据的图像系统级几何校正
//输入: 1. qbData 通用情报数据结构体
// 2. bSrcFirst 默认时优先对srcImg进行几何校正否则对dstImg进行几何校正
//输出: 1. qbData 含系统级几何校正后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoSysGeoCorrect(QBStru *qbData,
bool bSrcFirst = true);
//6.2 功能:基于复接数据的图像系统级几何校正(重载)
//输入: 1. srcImg 输入图像数据
// 2. qbData 输入复接数据
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoSysGeoCorrect(ImgStru *dstImg,
const ImgStru *srcImg,
const struQB_FJ *qbData);
//6.3 功能:基于地面控制点的几何精校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_XY 控制点(像素坐标)
// 3. GCP_LonLat 控制点(经纬度坐标)
// 4. type: 变换类型 -1自适应 0线性 1二次多项式
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoGCPGeoCorrectImg(ImgStru *dstImg,
const ImgStru *srcImg,
const std::vector<Point2d>& GCP_XY,
const std::vector<Point2d>& GCP_LonLat,
int type = -1);
//6.4 功能: OpenCV图像格式基于地面控制点的几何精校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_XY 控制点(像素坐标)
// 3. GCP_LonLat 控制点(经纬度坐标)
// 4. type: 变换类型 -1自适应 0线性 1二次多项式
//输出: 1. dstImg 输出图像数据
// 2. LBbox 经纬度边界
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoGCPGeoCorrectImg( cv::Mat& dstImg,
GeoBoundingBox& LBbox,
const cv::Mat& srcImg,
const std::vector<cv::Point2d>& GCP_XY,
const std::vector<cv::Point2d>& GCP_LonLat,
int type = -1);
//6.5 功能:基于控制点的几何校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_xy 控制点(畸变像素坐标)
// 3. GCP_XY 控制点(参考图像像素坐标)
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCPBasedImgCorrect( cv::Mat &dstImg,
const cv::Mat &srcImg,
const std::vector<cv::Point2d>& GCP_xy,
const std::vector<cv::Point2d>& GCP_XY);
// 7. GeoTIFF文件生成保存 算法:王家星
//7.1 功能保存情报数据至本地文件GeoTiff格式
//输入: 1. qbData 通用情报数据结构体
// 2. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
//说明: 可能会先执行几何校正操作,再保存;
IMGPROCESS_API bool SaveToGeoTIFF(QBStru *qbData,
string savePath = "");
//7.2 功能保存图像数据至本地文件GeoTiff格式
//输入: 1. Img 通用情报数据结构体
// 2. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
IMGPROCESS_API bool SaveToGeoTIFF(const ImgStru *Img,
string savePath = "");
//7.3 功能保存图像数据至本地文件GeoTiff格式
//输入: 1. Img OpenCV图像
// 2. LBbox 经纬度边界
// 3. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
IMGPROCESS_API bool SaveToGeoTIFF(cv::Mat& Img,
GeoBoundingBox& LBbox,
string savePath = "");
// 8. 距离、方位量算 算法:王家星
//8.1 功能:计算图像(几何校正前)中两点间的距离和方位(重载)
//输入: 1. frameData 通用复接数据结构体
// 2. pt1 起点(像素坐标)
// 3. pt2 终点(像素坐标)
//输出: 1. distance 距离
// 2. azAngle 方位,起点点到终点
// 3. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculateTwoPtsDistanceAzimuth( double &distance,
double &azAngle,
const struQB_FJ *frameData,
cv::Point pt1,
cv::Point pt2);
//8.2 功能:计算图像中两点间的距离和方位
//输入: 1. qbData 通用情报数据结构体
// 2. pt1 起点(像素坐标)
// 3. pt2 终点(像素坐标)
// 4. flagsflags = 0标识pt1、pt2为几何校正前图像中的点
// flags = 1标识pt1、pt2为几何校正后图像中的点
//输出: 1. distance 距离
// 2. azAngle 方位,起点点到终点
// 3. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculateTwoPtsDistanceAzimuth( double &distance,
double &azAngle,
const QBStru *qbData,
cv::Point pt1,
cv::Point pt2,
int flags = 0);
// 9. 面积量算 算法:王家星
//9.1 功能:计算图像(几何校正前)中多点组成的多边形面积
//输入: 1. frameData 复接数据
// 2. points 指向点坐标的指针
// 3. count 点数目
//输出: 1. area :多边形面积
// 2. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculatePloygonArea(double &area,
const struQB_FJ *frameData,
cv::Point *points,
int count);
//9.2 功能:计算图像中多边形面积
//输入: 1. qbData 通用情报数据结构体
// 2. point 多点指针(像素坐标)
// 3. count 点数目
// 4. flagsflags = 0标识为几何校正前图像中的点
// flags = 1标识为几何校正后图像中的点
//输出: 1. area 面积(平方米)
// 2. 返回值计算有效返回true否则返回false
//说明: 各点应为顺序或者逆序,不能乱序
IMGPROCESS_API bool CalculatePloygonArea(double &area,
const QBStru *qbData,
cv::Point* point,
int count,
int flags = 0);
//10 功能:基于经纬度读取地面高程
//输入:
// 1. fLonDeg: 经度(度)
// 2. fLatDeg: 纬度(度)
// 3. sDir: 高程数据文件存储路径, 默认设为:"D:\\ElevationData"
//
//输出:
// 1. fElevator:高程(米)
//
//返回值若函数运行成功返回true否则返回false
IMGPROCESS_API bool GetElevation( float& fElevator, double dLonDeg, double dLatDeg, string sDir, bool bNearst = false);
IMGPROCESS_API void ClearDem();
// 11 图像融合算法
// 11.1 功能:函数 DoFastFuseImgRGBplusIR() 快速融合两幅输入图像
// 输入:
// img1 输入图像1RGB三通道
// img2 输入图像2IR三通道或单通道
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFastFuseImgRGBplusIR(cv::Mat &dst, const cv::Mat RGBimg, const cv::Mat IRimg);
// 11.2 功能:函数 DoFuseImgRGBplusIR() 基于小波变换融合两幅输入图像
// 输入:
// img1 输入图像1RGB三通道
// img2 输入图像2IR三通道或单通道
// wname: 小波名称
// 支持小波:
// 1. haar
// 2. symN [1, 10]
// 3. dbN [1, 10]
// 4. coifN [1, 5]
// level小波分解层数
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFuseImgRGBplusIR(cv::Mat &dst, const cv::Mat RGBimg, const cv::Mat IRimg, const string wname = "sym5", const unsigned int level = 10);
// 11.3 功能:函数 FuseImg() 基于小波变换融合两幅输入图像
// 输入:
// img1 输入图像1
// img2 输入图像2
// wname: 小波名称
// 支持小波:
// 1. haar
// 2. symN [1, 10]
// 3. dbN [1, 10]
// 4. coifN [1, 10]
// level小波分解层数
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFuseImg(cv::Mat &dst, const cv::Mat img1, const cv::Mat img2, const string wname = "sym5", const unsigned int level = 10);
// 12 超分重建
// 功能:灰度图像(红外图像)超分辨率构建
// 输入:
// imgDeque 输入图像序列要求图像尺寸相同类型为CV_8UC1
// 输出:
// dst: 输出超分图像
// 返回重建中有效的图像数目
IMGPROCESS_API int GetSuperResolutionImg(cv::Mat &dst, const std::deque<cv::Mat> &imgDeque, double multiple = 2);
#endif