#ifndef STEREO_VISION_PROCESSOR_H
#define STEREO_VISION_PROCESSOR_H
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudawarping.hpp>
#include <opencv2/cudacodec.hpp>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <chrono>
#include <string>
#include <vector>
#include "FasterStereoCuda.h"
#include "option_manager.h"
using namespace cv;
using namespace std;
// CUDA错误检查宏
#ifndef CUDA_CHECK
#define CUDA_CHECK(callstr)\
{\
cudaError_t error_code = callstr;\
if (error_code != cudaSuccess) {\
std::cerr << "CUDA error " << error_code << " at " << __FILE__ << ":" << __LINE__;\
assert(0);\
}\
}
#endif
// 使用页锁定内存
#define USING_PAGE_LOCKED_MEMORY
class StereoVisionProcessor {
public:
// 构造函数和析构函数
StereoVisionProcessor();
~StereoVisionProcessor();
// 初始化函数
bool Initialize(const std::string& left2right_xml_path,
const std::string& left2top_xml_path,
int desired_width = 1920,
int desired_height = 1080);
// 处理单帧图像
bool ProcessFrame(const cv::Mat& input_frame,
cv::Mat& disparity_map,
cv::Mat& color_disparity_map,
double& processing_time_ms);
// 获取处理统计信息
struct ProcessingStats {
double read_time_ms;
double gray_conversion_time_ms;
double image_cut_time_ms;
double rectification_time_ms;
double stereo_matching_time_ms;
double normalization_time_ms;
double image_registration_time_ms;
double fusion_time_ms;
double total_time_ms;
double fps;
};
ProcessingStats GetLastProcessingStats() const { return last_stats_; }
// 设置相机参数
void SetCameraParameters(const cv::Mat& cameraMatrix1, const cv::Mat& cameraMatrix2,
const cv::Mat& distCoeffs1, const cv::Mat& distCoeffs2,
const cv::Mat& R, const cv::Mat& T,
const cv::Mat& cameraMatrix1_l2t, const cv::Mat& cameraMatrix2_l2t,
const cv::Mat& distCoeffs1_l2t, const cv::Mat& distCoeffs2_l2t,
const cv::Mat& R_l2t, const cv::Mat& T_l2t);
// 释放资源
void Release();
private:
// 相机参数
cv::Mat cameraMatrix1_, cameraMatrix2_;
cv::Mat distCoeffs1_, distCoeffs2_;
cv::Mat R_, T_;
cv::Mat cameraMatrix1_l2t_, cameraMatrix2_l2t_;
cv::Mat distCoeffs1_l2t_, distCoeffs2_l2t_;
cv::Mat R_l2t_, T_l2t_;
// 立体校正参数
cv::Mat R1_, R2_, P1_, P2_, Q1_;
cv::Mat R3_, R4_, P3_, P4_, Q2_;
// 重映射矩阵
cv::Mat remapm_x_1_, remapm_y_1_, remapm_x_2_, remapm_y_2_;
cv::Mat remapml2t_x_1_, remapml2t_y_1_, remapml2t_x_3_, remapml2t_y_3_;
cv::Mat map_revert_x_, map_revert_y_;
cv::Mat map_revert_t2r_x_, map_revert_t2r_y_;
// GPU重映射矩阵
cv::cuda::GpuMat remapm_x_1_gpu_, remapm_y_1_gpu_, remapm_x_2_gpu_, remapm_y_2_gpu_;
cv::cuda::GpuMat remapml2t_x_1_gpu_, remapml2t_y_1_gpu_, remapml2t_x_3_gpu_, remapml2t_y_3_gpu_;
cv::cuda::GpuMat map_revert_x_gpu_, map_revert_y_gpu_;
cv::cuda::GpuMat map_revert_t2r_x_gpu_, map_revert_t2r_y_gpu_;
// 图像尺寸
cv::Size img_l2rsize_;
cv::Size img_l2tsize_;
int width_, height_;
// 立体匹配器
FasterStereoCuda stereo1_, stereo2_;
FasterStereoCuda::StereoOption1* ste_opt1_;
FasterStereoCuda::StereoOption1* ste_opt2_;
// CUDA内存
float *d_d_data_;
int *d_min_, *d_max_;
uchar *d_img_left_, *d_disp_mat_;
uchar *d_img1_, *d_trans_, *d_dsts_;
// 页锁定内存
unsigned char* img_left_;
unsigned char* img_right_;
float* d_data_;
// 处理统计
ProcessingStats last_stats_;
// 内部处理函数
bool InitializeStereoMatchers();
bool InitializeRemapMatrices();
bool InitializeCudaMemory();
void ProcessStereoMatching(int stereo_flag, const cv::Mat& left_img, const cv::Mat& right_img, cv::Mat& disparity_map);
void OptimizeSeamCUDA(cv::Mat& img1, cv::Mat& trans, cv::Mat& dst);
void ProcessDisparityCUDA(float* d_data, uchar* img_left, cv::Mat& disp_mat, int width, int height, int stereo_flag);
void cuda_remap(cv::InputArray _src, cv::OutputArray _dst, cv::InputArray _map1, cv::InputArray _map2, int interpolation);
cv::Mat ResizeImage(const cv::Mat& src, double scale, int interp = cv::INTER_LINEAR);
};
#endif // STEREO_VISION_PROCESSOR_H
注释上述代码