Ubuntu16 下 OpenCV 的一些报错及操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshinefcx/article/details/83859408

一、查看当前Opencv版本

在终端输入下面的命令,即可查看opencv版本

pkg-config --modversion opencv

二、特征提取器与描述子提取 声明(opencv2.x 版本与 opencv3.x对比)

当需要调用opencv库中的特征提取器和描述子计算的函数时,以ORB特征为例,在opencv2.x中,调用方法如下:

// 首先声明特征提取器与描述子提取器
    cv::Ptr<cv::FeatureDetector> detector;
    cv::Ptr<cv::DescriptorExtractor> descriptor;

    
    detector = cv::FeatureDetector::create("ORB");
    descriptor = cv::DescriptorExtractor::create("ORB");


//开始提取关键点并计算描述子
    vector< cv::KeyPoint > kp1;
    detector->detect( rgb1, kp1 );  //提取关键点,将图像rgb中的特征点存在kp1中


//计算描述子
    cv::Mat desp1;
    descriptor->compute( rgb1, kp1, desp1 );    //通过图像rgb1和它的特征点kp1来计算 各个特征点的描述子,并存在desp1中

由于opencv针对3.0以后的版本,特征提取器的声明方式有变化,因此在opencv3.x版本下使用上述的特征提取的声明方式的话,会报错,信息如下:

detectFeatures.cpp:37:16: error: ‘create’ is not a member of ‘cv::FeatureDetector {aka cv::Feature2D}’
     detector = cv::FeatureDetector::create("ORB");

解决方法为,将特征提取器的声明变成open3.x中的方式,调用方法如下:

    // 声明特征提取器与描述子提取器
    cv::Ptr<cv::FeatureDetector> detector;
    cv::Ptr<cv::DescriptorExtractor> descriptor;


    detector = cv::ORB::create();
    descriptor = cv::ORB::create();

    
    // 提取关键点
    vector< cv::KeyPoint > kp1, kp2; 
    detector->detect( rgb1, kp1 );  //提取关键点

    // 计算描述子
    cv::Mat desp1, desp2;
    descriptor->compute( rgb1, kp1, desp1 );

再次编译就不会出错了。

三、Opencv使用中一些报错的处理

 问题1:报错内容如下:

OpenCV Error: Assertion failed (confidence > 0 && confidence < 1) in run, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/calib3d/src/ptsetreg.cpp, line 178
terminate called after throwing an instance of 'cv::Exception'
  what():  /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/calib3d/src/ptsetreg.cpp:178: error: (-215) confidence > 0 && confidence < 1 in function run

已放弃 (核心已转储)

原因分析:不同opencv版本给出的solvePnPRansac的接口不一样,以opencv2.x  和 opencv3.x中对solvePnPRansac的定义说明:

在opencv2.x中声明形式如下:

void solvePnPRansac(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int iterationsCount=100, float reprojectionError=8.0, int minInliersCount=100, OutputArray inliers=noArray(), int flags=ITERATIVE )

在opencv3.x中声明形式如下:

bool solvePnPRansac(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int iterationsCount=100, float reprojectionError=8.0, double confidence=0.99, OutputArray inliers=noArray(), int flags=SOLVEPNP_ITERATIVE )

相比之下可以发现,主要区别在于double confidence=0.99这个参数,并且经过测试,这个参数不能大于1.00,超过的话会出现上述报错信息。

猜你喜欢

转载自blog.csdn.net/sunshinefcx/article/details/83859408