在这个示例之后,我正在尝试构建一个识别视频中物体的应用程序。
我的程序由以下步骤组成(请参见每个步骤的代码示例):
- 将要识别的对象的图像读入
cv::Mat
对象中。 - 检测对象中的关键点并计算描述符。
- 读取视频的每一帧,
- 检测每一帧的关键点并计算描述符,
- 将帧的描述符与对象的描述符进行匹配,
- 绘制结果。
问题:第6步导致分段错误(请参见下面的代码)。
问题:是什么原因导致了这个错误,如何修复它?
谢谢!
注:
- 在段错误之前,该程序运行了几帧。崩溃发生在第23帧,这是视频中第一个有内容的帧(即不完全为黑色的帧)。
- 通过删除
drawMatches(...);
的行,没有崩溃。 - 在Windows 7、OpenCV 2.4.2和MinGW上运行。
调试尝试:
通过gdb运行程序会产生以下消息:
Program received signal SIGSEGV, Segmentation fault.
0x685585db in _fu156___ZNSs4_Rep20_S_empty_rep_storageE () from c:\opencv\build\install\bin\libopencv_features2d242.dll
步骤1 - 读取对象的图像:
Mat object;
object = imread(OBJECT_FILE, CV_LOAD_IMAGE_GRAYSCALE);
第二步 - 检测对象中的关键点并计算描述符:
SurfFeatureDetector detector(500);
SurfDescriptorExtractor extractor;
vector<KeyPoint> keypoints_object;
Mat descriptors_object;
detector.detect(object , keypoints_object);
extractor.compute(object, keypoints_object, descriptors_object);
步骤3-6:
VideoCapture capture(VIDEO_FILE);
namedWindow("Output",0);
BFMatcher matcher(NORM_L2,true);
vector<KeyPoint> keypoints_frame;
vector<DMatch> matches;
Mat frame,
output,
descriptors_frame;
while (true)
{
//step 3:
capture >> frame;
if(frame.empty())
{
break;
}
cvtColor(frame,frame,CV_RGB2GRAY);
//step 4:
detector.detect(frame, keypoints_frame);
extractor.compute(frame, keypoints_frame, descriptors_frame);
//step 5:
matcher.match(descriptors_frame, descriptors_object, matches);
//step 6:
drawMatches(object, keypoints_object, frame, keypoints_frame, matches, output);
imshow("Output", output);
waitKey(1);
}
段错误前的截屏:
![截屏](https://istack.dev59.com/VrVAK.webp)
![第22帧](https://istack.dev59.com/2Hxj8.webp)
![第23帧](https://istack.dev59.com/GQk2R.webp)
drawMatches
上。此外,我怀疑这不是库本身的问题;我认为我可能是在错误地使用它。另外,问题不在于matches
,因为还有其他空帧,在其中matches
为空,并且问题不会发生。顺便说一下,我每次迭代都会清空matches
对象(虽然我认为这并不是真正必要的);我只是没有在这里写出来。 - EyalAr