2. OpenCV 可视化(Viz)——相机视锥

2. OpenCV 可视化(Viz)——相机视锥

这一节是显示相机视锥及图像,使相机空间位置更加立体。官方文档内容为:

在这里插入图片描述

OpenCV_Tutorials

当然,主要的函数就是 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版权协议,转载请附上原文出处链接和本声明。