程序在使用OpenCV进行对象识别时崩溃

时间:2017-02-24 10:26:27

标签: c++ image opencv feature-extraction feature-detection

我正在使用SURF来识别视频帧中的对象。对象识别功能如下

void objrecognition(Mat* inframe, Mat* inimage, vector<KeyPoint> kp_image, std::vector<Point2f> obj_corners, int num)
{

std::vector<Point2f> obj;
std::vector<Point2f> scene;

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


extractor.compute(*inimage, kp_image, des_image);
//matcher.knnMatch(apsobjparam->des_object, des_image, matches, 2);

matcher.knnMatch(sobjectparam[num].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]);
    }
}


if (good_matches.size() >= 4)
{
    for (int i = 0; i < good_matches.size(); i++)
    {
        //Get the keypoints from the good matches
        obj.push_back(sobjectparam[num].kp_object[good_matches[i].queryIdx].pt);
        scene.push_back(kp_image[good_matches[i].trainIdx].pt);
    }

    //Draw only "good" matches
    //drawMatches(object, kp_object, *inimage, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

    H = findHomography(obj, scene, CV_RANSAC);

    perspectiveTransform(obj_corners, scene_corners, H);

    line(*inframe, scene_corners[0], scene_corners[1], Scalar(0, 255, 0), 4);

    line(*inframe, scene_corners[1], scene_corners[2], Scalar(0, 255, 0), 4);

    line(*inframe, scene_corners[2], scene_corners[3], Scalar(0, 255, 0), 4);

    line(*inframe, scene_corners[3], scene_corners[0], Scalar(0, 255, 0), 4);

}

putText(*inframe,
    sobjectparam[num].label,
    scene_corners[0], // Coordinates
    cv::FONT_HERSHEY_COMPLEX_SMALL, // Font
    1.0, // Scale. 2.0 = 2x bigger
    cv::Scalar(255, 255, 255), // Color
    1, // Thickness
    CV_AA, false); // Anti-alias

imshow("Good Matches", *inframe);



}

哪里

  inframe - is input colour frame from webcam for display

  inimage - is gray scale frame for processing

  kp_image - is the frame keypoints

  des_object - Descriptor of object (Obtained from XML file)

  des_image - Descriptor of current video frame

  sobjectparam - Structure for object keypoints and descriptors

我要检测3个物体。

检测工作正常,我能够在对象周围绘制边界框。

对于无限循环中视频的每一帧,main中的函数调用如下:

Mat image;

  std::vector<KeyPoint> kp_image;
  cvtColor(frameMat, image, CV_RGB2GRAY);

  detector.detect(image, kp_image);


  objrecognition(&frameMat, &image, kp_image, obj_corners, 0);//Deo
  objrecognition(&frameMat, &image, kp_image, obj_corners_two, 1);//Book
  objrecognition(&frameMat, &image, kp_image, obj_corners_three, 2);//Bottle

其中,

frameMat - 当前视频帧

image - 用于处理的灰度帧

  • 问题:

程序在一段时间后随机崩溃,比如平均2分钟。

我不明白为什么会崩溃。任何人都可以解释为什么会发生这种情况。

  • 问题和我的理解:

1)。是因为内存管理不善(我​​认为OpenCvC ++)负责内存管理。

2)。是因为3个对象的多个函数调用(某些数组混淆了)??

3)。还有什么我想念的吗?

4)。我应该实现线程吗?

5)。是因为我在下面的实验中解释的原因。

  • 我的实验:

1)。我在下一行中看到了一些问题

matcher.knnMatch(sobjectparam[num].des_object, des_image, matches, 2)

当我只使用一个对象来检测没有函数调用(一段代码而不调用函数)时,它有时(很少)在这一行崩溃。我怀疑当比赛不顺利时会发生一些事情。

  • EDITS

2)。如果我在镜头附近有一个普通屏幕(如白纸,手掌等),程序会崩溃并显示如下错误

cv :: flann :: build index_,file

中不支持的格式或格式组合

因此,基于flann的匹配器存在问题。

  • 分辨

发现问题:

当我在相机前面获得普通图像时,图像描述符为零,我正在尝试访问这个无法使用的BUFFER,因此它崩溃了。我做了检查,问题得到了解决。

0 个答案:

没有答案