surf-opencv使用二维特征点和单映射寻找已知物体,为什么程序一闪而过

问题描述

opencv使用二维特征点和单映射寻找已知物体,为什么程序一闪而过

程序编译成功,但运行的时候一闪,没有呈现图片。
单步调试的时候,程序就卡在imshow( "Good Matches & Object detection", img_matches );有图片框跳出,但卡住。。。。。
哪里出错了吗?谢谢大家了

#include "stdafx.h"
#include
#include
#include "opencv2/core/core.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"

using namespace cv;

void readme();

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

    Mat img_object = imread( "D:\12345.jpg", CV_LOAD_IMAGE_GRAYSCALE );
    Mat img_scene = imread( "D:\123456.jpg", 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;

    SurfFeatureDetector detector( minHessian );

    std::vector<KeyPoint> keypoints_object, keypoints_scene;

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

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

    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
    FlannBasedMatcher matcher;
    std::vector< 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< 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]); }
    }

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

    //-- Localize the object
    std::vector<Point2f> obj;
    std::vector<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 );
    }

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

    //-- Get the corners from the image_1 ( the object to be "detected" )
    std::vector<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<Point2f> scene_corners(4);

    perspectiveTransform( obj_corners, scene_corners, H);

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

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

    if (waitKey(30) >= 0)
    return 0;

}

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

解决方案

单步执行调试下,看看具体在哪里出错,检查下指针

时间: 2025-01-30 01:31:01

surf-opencv使用二维特征点和单映射寻找已知物体,为什么程序一闪而过的相关文章

OpenCV 通过 Features2D 和 Homography 查找已知对象

OpenCV 通过 Features2D 和 Homography 查找已知对象 目标 本文中你将学会: 使用 findHomography 函数来查找匹配关键点之间的转换 使用 perspectiveTransform 来映射点 代码 完整的代码可从这里 下载 #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/featur

大二,学过c和java如何实现硬盘测试读写速度程序

问题描述 大二,学过c和java如何实现硬盘测试读写速度程序 多文件存储性能测试编写一套程序,可对x86系统.ARM系统进行多文件并发写入带宽测试.该程序有以下要求:1. 使用Linux操作系统运行,内核版本号不限:(在实验室服务器中运行)2. 测试方法:a) 程序启动时,指定并发存储文件的数量,并分别指定文件存储路径及文件名:(最多四个文件)b) 为每个文件申请内存空间,申请内存大小不限:c) 对每片内存使用递增数进行初始化:d) 为每路数据配备一个计时器,同时开启多路数据写入操作,并启动计时

c语言-已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表。

问题描述 已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表. 已知二叉树的中序遍历序列与层次遍历序列分别将值存于数组A[1-n].B[1-n]中,请编程建立二叉树的二叉链表. 二叉树结点定义 typedef struct { Elemtype data; BiNode* lchild,rchild; }BiNode,*BiTree; 解决方案 http://www.zybang.com/question/23e04267bb862ea67197

转载未知大小的图片在一个已知大小容器中的水平和垂直居中(二)_经验交流

这是一个未知大小的图片在一个已知大小容器中的水平和垂直居中的例子,原文标题:"Centering an image of unknown size in an outer container of known size", 作者:Stu Nicholls form:http://www.cssplay.co.uk/menu/centered.html ,发表日期:15th October 2006. 此文由forestgan于2006-10-17翻译发表,更多文章. 这个水平和垂直居中

ASP编程入门进阶(二):认识表单

编程 申明:asp编程入门进阶系列文章COPY自http://www.cnbruce.com/blog/ 部分运行代码请到该站进行在线测试说实话,无论是asp,php还是jsp进行网络编程的时候,都离不开和用户的交互.而人机对话的平台,基本上是靠相应的文本.列表框进行输入,然后通过按钮提交送至数据库的.所以学习网络编程就一定要了解这些输入平台相关的东西:表单(form)其基本格式如下:<form name="form1" action="xxx.asp" me

activiti自定义流程之自定义表单(二):创建表单

注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进行修改. 由于自己的前端相关技术太渣,因此好多东西都不会用,导致修改实现的过程也是破费了一番功夫,头皮发麻了好几天. 既然是用别人的插件进行修改,那么我想如果只是单独的贴出我修改后的代码,可能没有前后进行对比好理解,因此这里就把原代码和修改后的同时对比着贴出,以便于朋友们能从对比中更快的得到启发.

单链表(二):如何实现单链表的排序、逆置(逆序)

1.单链表的排序 示例代码如下: #include<iostream> using namespace std; ///单链表结构体:结点 typedef struct student { int data; //结点中的数据 struct student *next; //指向链表下一个结点的指针 }node; node *head; //头结点指针 int index; //链表长度 ///建立单链表 void *create() { node *p,*s; //增加结点的位置指针.要增加

二维数组-新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点

问题描述 新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点 Description 给出一个长方体,求该长方体每个正切面上的元素之和的最大值. 正切面的意思就是与长方体某一面平行的切面.如果把长方体看作是一个三维数组,那么每个切面就是一个二维数组. Input 第一行是3个正整数a.b.c,分别表示长方体的长.宽.高.0 < a, b, c ≤ 60 接下来是 c 块数据,每一块数据有a行.每行b个整数. Output 输出切面元素和的最大值. Sample

ASP编程入门进阶(二):认识表单_ASP基础

说实话,无论是asp,php还是jsp进行网络编程的时候,都离不开和用户的交互.而人机对话的平台,基本上是靠相应的文本.列表框进行输入,然后通过按钮提交送至数据库的.所以学习网络编程就一定要了解这些输入平台相关的东西:表单(form)其基本格式如下:<form name="form1" action="xxx.asp" method="post"> <input type="text" name="