2. OpenCV 可视化(Viz)——相机视锥
这一节是显示相机视锥及图像,使相机空间位置更加立体。官方文档内容为:

当然,主要的函数就是 WCameraPosition
完成效果:
单个视锥

多个视锥:

程序内容
主程序:
//
// Created by zzl on 2020/11/15.
//
// system
#include <iostream>
// Eigen 一定要在OpenCV前面
#include "eigen3/Eigen/Core"
#include "eigen3/Eigen/Geometry"
// OpenCV
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/viz.hpp"
#include "opencv2/core/eigen.hpp" // 要在Eigen 头文件后面
using namespace std;
using namespace cv;
int main(int argc,char** argv){
//-- 生成窗口
viz::Viz3d mainWindow("Main_Window");
//-- 创建Camera类、设置相机位置
//--- Camera类是计算相机参数的一个类。我们设置一个3x3的内参数,fx = 700 ,fy = 700 ,cx = 320, cy = 240
Matx33f intrisicParams(700.0,0.0,320.0,0.0,700.0,240.0,0.0,0.0,1.0); // 内参矩阵
viz::Camera mainCamera(intrisicParams,Size(640,480)); // 初始化相机类
// --- 导入图像
Mat image = imread("./data/chessboard.png",0);
if(image.empty())
return -1;
viz::WCameraPosition camParams(mainCamera.getFov(),image,1.0,viz::Color::white()); // 相机参数设置
Affine3f camPosition(Mat::eye(3,3,CV_32F),Vec3f(0,0,0));
//-- 显示
mainWindow.showWidget("Coordinate",viz::WCoordinateSystem(),Affine3f::Identity());
mainWindow.showWidget("Camera",camParams,camPosition);
mainWindow.spin();
//-- 以上为单个相机,再加入一个相机
viz::WCameraPosition camParams_2(mainCamera.getFov(),image,1.0,viz::Color::green()); // 2号相机参数设置
Eigen::AngleAxisf rotateVec(-CV_PI / 2,Eigen::Vector3f(0,1,0)); // 涉及绕轴的旋转矩阵的计算,所以引入了Eigen 库
Mat rotationMatrix;
eigen2cv(rotateVec.matrix(),rotationMatrix);
Affine3f camPosition_2(rotationMatrix,Vec3f(1.5,0,1.5));
mainWindow.showWidget("Coordinate",viz::WCoordinateSystem(),Affine3f::Identity());
mainWindow.showWidget("Camera",camParams,camPosition);
mainWindow.showWidget("Camera_2",camParams_2,camPosition_2);
mainWindow.spin();
cout<<"Hello World"<<endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
project(CylinderDisplay)
set(CMAKE_PREFIX_PATH "/home/zzl/opencv420/build/install/") // 我装了两个OpenCV版本
find_package(OpenCV 4 REQUIRED)
message(STATUS "OpenCV library status:")
message(STATUS " OpenCV Version: ${OpenCV_VERSION}" )
find_package(Pangolin)
find_package(Eigen3)
set(CMAKE_CXX_STANDARD 17)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${EIGEN3_INCLUDE_DIR})
add_executable(Blog cylinderBlog.cpp)
target_link_libraries(Blog ${OpenCV_LIBS} )
如果遇到平移向量不更新,可以尝试更换OpenCV版本(OpenCV3.4.2 + VTK7.1.1 有这个Bug,我更换到OpenCV 3.4.0 或者 OpenCV 4.2.0解决问题)
目前我使用 OpenCV 4.2.0 + VTK 7.1.1 一切正常
下一步博客更新计划:构造一个虚拟的标定环境,用虚拟相机采集图像,然后执行单目标定~
版权声明:本文为qq_29600745原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。