zoukankan      html  css  js  c++  java
  • 基于OpenCV做“三维重建”(4)--相机姿态还原和实现三维重建

    v当我们构建成功了viz,就可以使用3维效果给我们提供的便利,进一步进行一些3维的操作。
    在这个动画中,注意图片后面的那个黑线,对应的是相机的位置。
    /*------------------------------------------------------------------------------------------*
    This file contains material supporting chapter 11 of the book:
    OpenCV3 Computer Vision Application Programming Cookbook
    Third Edition
    by Robert Laganiere, Packt Publishing, 2016.
    This program is free software; permission is hereby granted to use, copy, modify,
    and distribute this source code, or portions thereof, for any purpose, without fee,
    subject to the restriction that the copyright notice may not be removed
    or altered from any source or altered source distribution.
    The software is released on an as-is basis and without any warranties of any kind.
    In particular, the software is not guaranteed to be fault-tolerant or free from failure.
    The author disclaims all warranties with regard to this software, any use,
    and any consequent failure, is purely the responsibility of the user.
    Copyright (C) 2016 Robert Laganiere, www.laganiere.name
    *------------------------------------------------------------------------------------------*/
    #include "stdafx.h"
    #include <opencv2/core.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    #include <opencv2/viz.hpp>
    #include <opencv2/calib3d.hpp>
    #include <iostream>
    int main()
    {
        // Read the camera calibration parameters
        cv::Mat cameraMatrix;
        cv::Mat cameraDistCoeffs;
        cv::FileStorage fs("calib.xml"cv::FileStorage::READ);
        fs["Intrinsic"] >> cameraMatrix;
        fs["Distortion"] >> cameraDistCoeffs;
        std::cout << " Camera intrinsic: " << cameraMatrix.rows << "x" << cameraMatrix.cols << std::endl;
        std::cout << cameraMatrix.at<double>(0, 0) << " " << cameraMatrix.at<double>(0, 1) << " " << cameraMatrix.at<double>(0, 2) << std::endl;
        std::cout << cameraMatrix.at<double>(1, 0) << " " << cameraMatrix.at<double>(1, 1) << " " << cameraMatrix.at<double>(1, 2) << std::endl;
        std::cout << cameraMatrix.at<double>(2, 0) << " " << cameraMatrix.at<double>(2, 1) << " " << cameraMatrix.at<double>(2, 2) << std::endl << std::endl;
        cv::Matx33d cMatrix(cameraMatrix);
        // Input image points
        std::vector<cv::Point2fimagePoints;
        imagePoints.push_back(cv::Point2f(136, 113));
        imagePoints.push_back(cv::Point2f(379, 114));
        imagePoints.push_back(cv::Point2f(379, 150));
        imagePoints.push_back(cv::Point2f(138, 135));
        imagePoints.push_back(cv::Point2f(143, 146));
        imagePoints.push_back(cv::Point2f(381, 166));
        imagePoints.push_back(cv::Point2f(345, 194));
        imagePoints.push_back(cv::Point2f(103, 161));
        // Input object points
        std::vector<cv::Point3fobjectPoints;
        objectPoints.push_back(cv::Point3f(0, 45, 0));
        objectPoints.push_back(cv::Point3f(242.5, 45, 0));
        objectPoints.push_back(cv::Point3f(242.5, 21, 0));
        objectPoints.push_back(cv::Point3f(0, 21, 0));
        objectPoints.push_back(cv::Point3f(0, 9, -9));
        objectPoints.push_back(cv::Point3f(242.5, 9, -9));
        objectPoints.push_back(cv::Point3f(242.5, 9, 44.5));
        objectPoints.push_back(cv::Point3f(0, 9, 44.5));
        // Read image
        cv::Mat image = cv::imread("e:/template/bench2.jpg");
        // Draw image points
        for (int i = 0; i < 8; i++) {
            cv::circle(imageimagePoints[i], 3, cv::Scalar(0, 0, 0),2);
        }
        cv::imshow("An image of a bench"image);
        // Create a viz window
        cv::viz::Viz3d visualizer("Viz window");
        visualizer.setBackgroundColor(cv::viz::Color::white());
        /// Construct the scene
        // Create a virtual camera
        cv::viz::WCameraPosition cam(cMatrix,  // matrix of intrinsics
            image,    // image displayed on the plane
            30.0,     // scale factor
            cv::viz::Color::black());
        // Create a virtual bench from cuboids
        cv::viz::WCube plane1(cv::Point3f(0.0, 45.0, 0.0), 
            cv::Point3f(242.5, 21.0, -9.0), 
            true,  // show wire frame 
            cv::viz::Color::blue());
        plane1.setRenderingProperty(cv::viz::LINE_WIDTH, 4.0);
        cv::viz::WCube plane2(cv::Point3f(0.0, 9.0, -9.0), 
            cv::Point3f(242.5, 0.0, 44.5), 
            true,  // show wire frame 
            cv::viz::Color::blue());
        plane2.setRenderingProperty(cv::viz::LINE_WIDTH, 4.0);
        // Add the virtual objects to the environment
        visualizer.showWidget("top"plane1);
        visualizer.showWidget("bottom"plane2);
        visualizer.showWidget("Camera"cam);
        // Get the camera pose from 3D/2D points
        cv::Mat rvectvec;
        cv::solvePnP(objectPointsimagePoints,      // corresponding 3D/2D pts 
            cameraMatrixcameraDistCoeffs// calibration 
            rvectvec);                    // output pose
        std::cout << " rvec: " << rvec.rows << "x" << rvec.cols << std::endl;
        std::cout << " tvec: " << tvec.rows << "x" << tvec.cols << std::endl;
        cv::Mat rotation;
        // convert vector-3 rotation
        // to a 3x3 rotation matrix
        cv::Rodrigues(rvecrotation);
        // Move the bench    
        cv::Affine3d pose(rotationtvec);
        visualizer.setWidgetPose("top"pose);
        visualizer.setWidgetPose("bottom"pose);
        // visualization loop
        while(cv::waitKey(100)==-1 && !visualizer.wasStopped())
        {
            visualizer.spinOnce(1,     // pause 1ms 
                true); // redraw
        }
        return 0;
    }

    三维重建这块,我也运行成功书本的例子:






    附件列表

    • 相关阅读:
      过滤器排序规则
      n维立体空间建模
      将多个Sheet导入到同一个Excel文件中
      Oracle分页查询
      SSH整合逻辑图
      MD5算法原理
      Spring框架整合Struts2
      Pandas入门——Series基本操作
      Python 使用selenium+webdriver爬取动态网页内容
      Python处理json和dict
    • 原文地址:https://www.cnblogs.com/jsxyhelu/p/10647399.html
    Copyright © 2011-2022 走看看