我正在使用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)
当我只使用一个对象来检测没有函数调用(一段代码而不调用函数)时,它有时(很少)在这一行崩溃。我怀疑当比赛不顺利时会发生一些事情。
2)。如果我在镜头附近有一个普通屏幕(如白纸,手掌等),程序会崩溃并显示如下错误
cv :: flann :: build index_,file
中不支持的格式或格式组合因此,基于flann的匹配器存在问题。
发现问题:
当我在相机前面获得普通图像时,图像描述符为零,我正在尝试访问这个无法使用的BUFFER,因此它崩溃了。我做了检查,问题得到了解决。