编译环境ubuntu20.04,vs code
先cmake文件
cmake_minimum_required(VERSION 2.8)
project(image)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++17")
find_package(OpenCV REQUIRED)
find_package( Pangolin REQUIRED)
find_package( Sophus REQUIRED)
include_directories("/usr/include/eigen3")
include_directories(${Pangolin_INCLUDE_DIRS})
add_executable(img image.cpp)
add_executable(distort undistort.cpp)
add_executable(stereo stereoVision.cpp)
add_executable(joint jointMap.cpp)
target_link_libraries(img ${OpenCV_LIBS})
target_link_libraries(distort ${OpenCV_LIBS})
target_link_libraries(stereo ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
target_link_libraries(joint ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
target_link_libraries(joint Sophus::Sophus)
然后是双目视觉
#include <opencv2/opencv.hpp>
#include <Eigen/Core>
#include <iostream>
#include <pangolin/pangolin.h>
#include <unistd.h>
using namespace std;
using namespace Eigen;
string left_file = "/home/martin/桌面/code/image/left.png";
string right_file = "/home/martin/桌面/code/image/right.png";
void showPointCloud(const vector<Vector4d, Eigen::aligned_allocator<Vector4d>> &pointcloud);
int main(int argc,char** argv)
{
double fx = 718.856, fy = 718.856, cx = 607.1928, cy = 185.2157; //相机内参
double b = 0.573; //基线宽度
cv::Mat left = cv::imread(left_file , 0); //读图
cv::Mat right = cv::imread(right_file, 0);
cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(
0,96,9,8*9*9,32*9*9,1,63,10,100,2);
/*双目立体匹配算法
参数含义解释(按顺序):
int minDisparity 最小差异值,通常是0,在个别情况需要进行改动,比如整流算法将图像改变
int numDisparities 最大差异减去最小差异。首先这个数字得大于零,其次还得能被16整除
int blockSize 匹配的块大小。必须是大于等于1的奇数,通常取值在3~11内
int P1 控制视差平滑度的第一个参数
int P2 控制视差平滑度的第二个参数。这两个值越大,差异越平滑。P1是相邻像素之间