C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – OpenCV cv :: findHomography运行时错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用从 Features2D + Homography to find a known object教程编译和运行代码,我得到这个
OpenCV Error: Assertion Failed (npoints >= 0 && points2.checkVector(2) == npoint
s && points1.type() == points2.type()) in unkNown function,file c:\Users\vp\wor
k\ocv\opencv\modules\calib3d\src\fundam.cpp,line 1062

运行时错误.调试后我发现程序在findHomography功能崩溃.

Unhandled exception at 0x760ab727 in OpenCVTemplateMatch.exe: Microsoft C++ exception: cv::Exception at memory LOCATIOn 0x0029eb3c..

在OpenCV的Introduction中,“cv命名空间”一章说

我改变了我的代码,并使用明确的命名空间说明符,但问题没有解决.如果可以,请帮我解决这个问题,或者说哪个功能和findHomography相同,不要崩溃程序.

这是我的代码

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"

void readme();

/** @function main */
int main( int argc,char** argv )
{
    if( argc != 3 )
    { readme(); return -1; }

    cv::Mat img_object = cv::imread( argv[1],CV_LOAD_IMAGE_GRAYSCALE );
    cv::Mat img_scene = cv::imread( argv[2],CV_LOAD_IMAGE_GRAYSCALE );

    if( !img_object.data || !img_scene.data )
    { std::cout<< " --(!) Error reading images " << std::endl; return -1; }

    //-- Step 1: Detect the keypoints using SURF Detector
    int minHessian = 400;

    cv::SurfFeatureDetector detector( minHessian );

    std::vector<cv::KeyPoint> keypoints_object,keypoints_scene;

    detector.detect( img_object,keypoints_object );
    detector.detect( img_scene,keypoints_scene );

    //-- Step 2: Calculate descriptors (feature vectors)
    cv::SurfDescriptorExtractor extractor;

    cv::Mat descriptors_object,descriptors_scene;

    extractor.compute( img_object,keypoints_object,descriptors_object );
    extractor.compute( img_scene,keypoints_scene,descriptors_scene );

    //-- Step 3: Matching descriptor vectors using FLAnn matcher
    cv::FlAnnBasedMatcher matcher;
    std::vector< cv::DMatch > matches;
    matcher.match( descriptors_object,descriptors_scene,matches );

    double max_dist = 0; double min_dist = 100;

    //-- Quick calculation of max and min distances between keypoints
    for( int i = 0; i < descriptors_object.rows; i++ )
    { double dist = matches[i].distance;
    if( dist < min_dist ) min_dist = dist;
    if( dist > max_dist ) max_dist = dist;
    }

    printf("-- Max dist : %f \n",max_dist );
    printf("-- Min dist : %f \n",min_dist );

    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
    std::vector< cv::DMatch > good_matches;

    for( int i = 0; i < descriptors_object.rows; i++ )
    { if( matches[i].distance < 3*min_dist )
    { good_matches.push_BACk( matches[i]); }
    }

    cv::Mat img_matches;
    cv::drawMatches( img_object,img_scene,good_matches,img_matches,cv::Scalar::all(-1),std::vector<char>(),cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

    //-- Localize the object
    std::vector<cv::Point2f> obj;
    std::vector<cv::Point2f> scene;

    for( int i = 0; i < good_matches.size(); i++ )
    {
        //-- Get the keypoints from the good matches
        obj.push_BACk( keypoints_object[ good_matches[i].queryIdx ].pt );
        scene.push_BACk( keypoints_scene[ good_matches[i].TrainIdx ].pt );
    }

    cv::Mat H = cv::findHomography( obj,scene,CV_RANSAC );

    //-- Get the corners from the image_1 ( the object to be "detected" )
    std::vector<cv::Point2f> obj_corners(4);
    obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( img_object.cols,0 );
    obj_corners[2] = cvPoint( img_object.cols,img_object.rows ); obj_corners[3] = cvPoint( 0,img_object.rows );
    std::vector<cv::Point2f> scene_corners(4);

    cv::perspectiveTransform( obj_corners,scene_corners,H);

    //-- Draw lines between the corners (the mapped object in the scene - image_2 )
    cv::line( img_matches,scene_corners[0] + cv::Point2f( img_object.cols,0),scene_corners[1] + cv::Point2f( img_object.cols,cv::Scalar(0,255,4 );
    cv::line( img_matches,scene_corners[2] + cv::Point2f( img_object.cols,cv::Scalar( 0,scene_corners[3] + cv::Point2f( img_object.cols,4 );

    //-- Show detected matches
    cv::imshow( "Good Matches & Object detection",img_matches );

    cv::waitKey(0);
    return 0;
}

/** @function readme */
void readme()
{ std::cout << " Usage: ./SURF_descriptor <img1> <img2>" << std::endl; }

解决方法

今天我遇到与此示例代码相同的问题. @数学咖啡是没有提取功能,因此obj和场景是空的.我取代了测试图片,它的工作.从纹理样式图像,您不能提取SURF功能.

一个方法是降低参数minHessianve.g. `int minHessian = 20;

或者通过更改几行来使用FAST特征检测器:

//-- Step 1: Detect the keypoints using SURF Detector
  int minHessian = 15;

  FastFeatureDetector detector( minHessian );

大佬总结

以上是大佬教程为你收集整理的c – OpenCV cv :: findHomography运行时错误全部内容,希望文章能够帮你解决c – OpenCV cv :: findHomography运行时错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。