C++ 为什么可以';t我似乎通过使用OpenCV和C++;?

C++ 为什么可以';t我似乎通过使用OpenCV和C++;?,c++,image,object,opencv,detection,C++,Image,Object,Opencv,Detection,首先,我要说的是,到目前为止,我已经在这个主题上使用了大量的内容 在上面提到的文章中,该示例使用网络摄像头和UI窗口来实时查看输出。我只是尝试使用类似的代码来比较两个图像(对应于一个图像和许多帧),但遇到了一些问题 所以我有两个图像(cv::Mat对象) 下面的代码不是很好,但这是总体思路: int minHessian = 500; SurfFeatureDetector detector( minHessian ); std::vector<KeyPoint> kp_objec

首先,我要说的是,到目前为止,我已经在这个主题上使用了大量的内容

在上面提到的文章中,该示例使用网络摄像头和UI窗口来实时查看输出。我只是尝试使用类似的代码来比较两个图像(对应于一个图像和许多帧),但遇到了一些问题

所以我有两个图像(cv::Mat对象)

下面的代码不是很好,但这是总体思路:

int minHessian = 500;

SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> kp_object;

SurfDescriptorExtractor extractor;
Mat des_object;

extractor.compute( object_1, kp_object, des_object );

FlannBasedMatcher matcher;

std::vector<Point2f> obj_corners(4);

//Get the corners from the object
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint( object_1.cols, 0 );
obj_corners[2] = cvPoint( object_1.cols, object_1.rows );
obj_corners[3] = cvPoint( 0, object_1.rows );

Mat des_image, img_matches;
std::vector<KeyPoint> kp_image;
std::vector<vector<DMatch > > matches;
std::vector<DMatch > good_matches;
std::vector<Point2f> obj;
std::vector<Point2f> scene;
std::vector<Point2f> scene_corners(4);
Mat H;

detector.detect( object_2, kp_image );
extractor.compute( object_2, kp_image, des_image );

matcher.knnMatch(des_object, des_image, matches, 2);

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
{
    if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
    {
        good_matches.push_back(matches[i][0]);
    }
}
int minHessian=500;
表面特征检测器(minHessian);
std::向量kp_对象;
表面描述符牵引器;
Mat des_对象;
compute(object_1、kp_object、des_object);
法兰巴斯德匹配器;
std::矢量obj_角(4);
//从对象获取角点
obj_角点[0]=cvPoint(0,0);
obj_角点[1]=cvPoint(object_1.cols,0);
obj_角点[2]=cvPoint(object_1.cols,object_1.rows);
obj_角点[3]=cvPoint(0,对象_1.2行);
Mat des_图像、img_匹配;
std::矢量kp_图像;
向量匹配;
向量良好匹配;
std::向量obj;
矢量场景;
std::矢量场景_角(4);
Mat H;
检测器。检测(对象2,kp图像);
compute(object_2、kp_image、des_image);
knnMatch(des_对象,des_图像,matches,2);
对于(int i=0;i
这里的问题是,因为
匹配.size()
等于
0
,所以它根本没有进入循环


我的问题是,(即使两个原始图像相同)为什么没有匹配?

您需要使用
检测器检测
对象1
中的关键点。检测(对象1,kp\u图像)


然后可以调用
extractor.compute(object_1,kp_object,des_object)如图所示

您需要使用
检测器检测
对象_1
中的关键点。检测(对象_1,kp_图像)


然后可以调用
extractor.compute(object_1,kp_object,des_object)如图所示

您需要使用
检测器检测
对象_1
中的关键点。检测(对象_1,kp_图像)


然后可以调用
extractor.compute(object_1,kp_object,des_object)如图所示

您需要使用
检测器检测
对象_1
中的关键点。检测(对象_1,kp_图像)


然后可以调用
extractor.compute(object_1,kp_object,des_object)如图所示

嗨,哈利,我不确定这一点,因为我从未使用过它,但你不应该用detector.detect(object_1,kp_图像)检测object_1中的关键点吗;第一?然后,您可以调用extractor.compute(object_1,kp_object,des_object)?如你所见,非常感谢!我从来没有发现过,我完全错过了!它正在工作。干杯作为答案提交,我将标记为解决方案。嗨,哈利,我不确定这一点,因为我从未使用过它,但你不应该用detector.detect检测对象_1中的关键点(对象_1,kp_图像);第一?然后,您可以调用extractor.compute(object_1,kp_object,des_object)?如你所见,非常感谢!我从来没有发现过,我完全错过了!它正在工作。干杯作为答案提交,我将标记为解决方案。嗨,哈利,我不确定这一点,因为我从未使用过它,但你不应该用detector.detect检测对象_1中的关键点(对象_1,kp_图像);第一?然后,您可以调用extractor.compute(object_1,kp_object,des_object)?如你所见,非常感谢!我从来没有发现过,我完全错过了!它正在工作。干杯作为答案提交,我将标记为解决方案。嗨,哈利,我不确定这一点,因为我从未使用过它,但你不应该用detector.detect检测对象_1中的关键点(对象_1,kp_图像);第一?然后,您可以调用extractor.compute(object_1,kp_object,des_object)?如你所见,非常感谢!我从来没有发现过,我完全错过了!它正在工作。干杯作为答案提交,我将标记为解决方案。
int minHessian = 500;

SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> kp_object;

SurfDescriptorExtractor extractor;
Mat des_object;

extractor.compute( object_1, kp_object, des_object );

FlannBasedMatcher matcher;

std::vector<Point2f> obj_corners(4);

//Get the corners from the object
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint( object_1.cols, 0 );
obj_corners[2] = cvPoint( object_1.cols, object_1.rows );
obj_corners[3] = cvPoint( 0, object_1.rows );

Mat des_image, img_matches;
std::vector<KeyPoint> kp_image;
std::vector<vector<DMatch > > matches;
std::vector<DMatch > good_matches;
std::vector<Point2f> obj;
std::vector<Point2f> scene;
std::vector<Point2f> scene_corners(4);
Mat H;

detector.detect( object_2, kp_image );
extractor.compute( object_2, kp_image, des_image );

matcher.knnMatch(des_object, des_image, matches, 2);

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
{
    if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
    {
        good_matches.push_back(matches[i][0]);
    }
}