【问题标题】:OpenCV 3d point projectionOpenCV 3d点投影
【发布时间】:2016-02-03 19:21:06
【问题描述】:

我在纠正 OpenCV 程序以投影 3d 点时遇到问题。在使用 OpenCV 的 projectPoints 函数时,我似乎遇到了这个问题。

这是我得到的错误:

OpenCV 错误:断言失败 (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1

这是我写的代码:

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <string>

std::vector<cv::Point3d> set3DPoints();

int main( int argc, char* argv[]) {
  // Setting given variables.
  double f = 500;
  double sx = 1;
  double sy = 1;
  double ox = 320;
  double oy = 240;

  std::vector<cv::Point3d> objectPoints = set3DPoints();


  cv::Mat Xw(1,3,cv::DataType<double>::type);

  Xw.at<double>(0,0) = 150;
  Xw.at<double>(0,1) = 200;
  Xw.at<double>(0,2) = 350;

  // Create the K matrix.
  cv::Mat K(3,3,cv::DataType<double>::type);

  K.at<double>(0,0) = -f/sx;
  K.at<double>(1,0) = 0;
  K.at<double>(2,0) = ox;

  K.at<double>(0,1) = 0;
  K.at<double>(1,1) = -f/sy;
  K.at<double>(2,1) = oy;

  K.at<double>(0,2) = 0;
  K.at<double>(1,2) = 0;
  K.at<double>(2,2) = 1;

  // Creating the Rotation Matrix
  cv::Mat R(3,3,cv::DataType<double>::type);

  R.at<double>(0,0) = 1; 
  R.at<double>(1,0) = 0; 
  R.at<double>(2,0) = 0; 

  R.at<double>(0,1) = 0; 
  R.at<double>(1,1) = 1; 
  R.at<double>(2,1) = 0; 

  R.at<double>(0,2) = 0; 
  R.at<double>(1,2) = 0; 
  R.at<double>(2,2) = 1;

  // Creating the Translation vector
  cv::Mat T(3,1,cv::DataType<double>::type);
  T.at<double>(0) = -70;
  T.at<double>(1) = -95;
  T.at<double>(2) = -120;

  std::cout << "K: " << "\n" << K << "\n";
  std::cout << "R: " << "\n" << R << "\n";
  std::cout << "T: " << "\n" << T << "\n";

  // Create zero distortion
  cv::Mat distCoeffs(4,1,cv::DataType<double>::type);
  distCoeffs.at<double>(0) = 0;
  distCoeffs.at<double>(1) = 0;
  distCoeffs.at<double>(2) = 0;
  distCoeffs.at<double>(3) = 0;

  // Creating Rodrigues rotation matrix
  cv::Mat rvecR(3,1,cv::DataType<double>::type);
  cv::Rodrigues(R,rvecR);

  std::vector<cv::Point2f> projectedPoints;

  cv::projectPoints(objectPoints, rvecR, T, K, distCoeffs, projectedPoints);

  for(unsigned int i=0; i<projectedPoints.size(); i++){
    std::cout << "Image point: " << objectPoints[i] << " Projected to " << projectedPoints[i] << "\n"; 
  }

  return 0;

}

std::vector<cv::Point3d> set3DPoints() {
  std::vector<cv::Point3d> points;

  double x,y,z;

  x=150;
  y=200;
  z=350;
  points.push_back(cv::Point3d(x,y,z));

  return points;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    函数projectPoints 需要相同类型的参数objectPointsimagePoints,而您将objectPoints 作为Point3d 传递,并将imagePoints 作为Point2f 传递。

    错误告诉你两种类型不同:double != float

    只需将projectedPoints 声明为Point2d,使其与Point3d 具有相同的类型:

     std::vector<cv::Point2d> projectedPoints;
    

    【讨论】:

    • 非常感谢!我刚刚开始使用 opencv,所以我对某些事情仍然有些迷茫。
    • @Miki 你救了我的命!干杯。
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多