2015-02-24 139 views
1

我一直在尝试设置一个基本的3D点flann knnsearch,但到目前为止还没有能够成功地将其工作。我已经尝试了许多不同的事情,所有这些事情都会返回错误。有一段时间我有问题与cv::flann::Index kdtree(cv::Mat(cvPointCloud).reshape(1), indexParams);抱怨类型不匹配。但似乎我不再看到那个错误,但是这个错误已经取代了它,我不知道该怎么做。OpenCV Flann - 断言失败

OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN (type0) && ((1 << type0) & fixedDepthMask) != 0)) in cv::_OutputArray::create, f ile E:\opencv\source\modules\core\src\matrix.cpp, line 2280

我的代码:

#include <opencv2/core/core.hpp> 
#include <opencv2/flann/flann.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <random> 


#define POINTS_IN_CLOUD 15 
#define NUM_NEAREST_NEIGHBORS 2 
#define NUM_SEARCHES 64 



int main() { 
    std::vector<cv::Point3f> cvPointCloud; 

    // Build the cvPointCloud 
    for (int i = 0; i < POINTS_IN_CLOUD; i++) { 
     int x = rand() % 100; 
     int y = rand() % 100; 
     int z = rand() % 100; 
     cvPointCloud.push_back(cv::Point3f(x, y, z)); 
    } 

    // Loop through and print out the points in the cloud 
    for (std::vector<cv::Point3f>::iterator it = cvPointCloud.begin(); it != cvPointCloud.end(); ++it) { 
     std::cout << *it << "\t"; 
    } 




    // KdTree with 4 random trees 
    cv::flann::KDTreeIndexParams indexParams(4); 
    cv::flann::Index kdtree(cv::Mat(cvPointCloud).reshape(1), indexParams); 


    // Point to find nearest neighbors 
    cv::Point3f pt = cv::Point3f(5, 5, 5); 

    // Generate the search query 
    std::vector<float> query; 
    query.push_back(pt.x); 
    query.push_back(pt.y); 
    query.push_back(pt.z); 


    std::vector<int> indices(NUM_NEAREST_NEIGHBORS); 
    std::vector<int> dists(NUM_NEAREST_NEIGHBORS); 
    kdtree.knnSearch(query, indices, dists, NUM_NEAREST_NEIGHBORS, cv::flann::SearchParams(NUM_SEARCHES)); 

    std::cout << indices[0]; 
    std::cout << dists[0]; 

    return 0; 
} 

如果有人可以点我到正确的方向,我将不胜感激!

回答

2

Opencv documentation,你的变量 'dists中' 需要一个

std::vector<float> dists(NUM_NEAREST_NEIGHBORS); 

不是

std::vector<int> dists(NUM_NEAREST_NEIGHBORS); 

在你的代码中声明。

+0

是否可以使用Point3i而不是Point3f?我所有的数据都是int,不想在它们之间混合。切换时收到以下错误:cv :: flann :: buildIndex_,文件E:\ opencv \ source \ modules \ flann \ src \ miniflann.cpp中的OpenCV错误:不支持的格式或格式组合(类型= 4)其中'type = 4'的行315'是'CV_32S' – Steven10172 2015-02-25 04:58:56

+0

我认为不行。它只接受Point3f的矢量作为输入。将您的数据向量转换为Point3f的向量,它只需要花费O(n)。 – 2015-02-25 06:26:01